Spring 使用介绍(二)—— IoC
一、简单使用:Hello World实例
1、maven添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
2、定义接口和类
public interface Hello {
void sayHello();
}
public class HelloImpl implements Hello {
@Override
public void sayHello() {
System.out.println("hello boy!");
}
}
3、spring配置,实例化bean
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- id 表示你这个组件的名字,class表示组件类 -->
<bean id="hello" class="cn.matt.spring.ioc.HelloImpl"></bean> </beans>
4、测试类
public class Test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
Hello hello = context.getBean(Hello.class);
hello.sayHello();
}
}
// 输出:hello boy!
说明:
beans的概念
由IoC容器管理的那些组成你应用程序的对象我们就叫它Bean, Bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了
ApplicationContext
ApplicationContext 继承自BeanFactory,可访问bean,有两个实现类:
ClassPathXmlApplicationContext 从classpath获取配置文件
FileSystemXmlApplicationContext 从文件系统获取配置文件
二、配置文件元素
在命名空间(http://www.springframework.org/schema/beans)下,Spring配置文件主要有四个元素:
<!-- 说明信息 -->
<description>说明信息</description> <!-- bean定义 -->
<bean id="hello" class="cn.matt.spring.ioc.HelloImpl"></bean> <!-- bean别名 -->
<alias name="hello" alias="helloAlias"/> <!-- 导入其他配置文件 -->
<import resource="other.xml"/>
说明:
1、多个配置文件,除了使用<import>导入,也可以使用ClassPathXmlApplicationContext支持多个文件的构造方法
2、bean的命名,应符合Java命名规范,采用驼峰式命名法
3、bean名称须唯一,可采用name或id属性指定,但规范的做法是使用id
三、bean的构造
bean的构造有三种方式:
1、构造器方式
<!-- 默认构造器 -->
<bean id="hello" class="cn.matt.spring.ioc.HelloImpl"></bean> <!-- 构造器 -->
<bean id="hello2" class="cn.matt.spring.ioc.HelloImpl">
<constructor-arg index="0" value="kevin"/>
</bean>
2、静态工厂方式
public class HelloStaticFactory {
public static Hello getInstance(String name) {
return new HelloImpl(name);
}
}
<bean id="hello3" class="cn.matt.spring.ioc.HelloStaticFactory" factory-method="getInstance">
<constructor-arg index="0" value="hello kevin"/>
</bean>
3、实例工厂方式
public class HelloFactory {
public Hello getInstance(String name) {
return new HelloImpl(name);
}
}
<bean id="helloFactory" class="cn.matt.spring.ioc.HelloFactory"></bean> <bean id="hello4" factory-bean="helloFactory" factory-method="getInstance">
<constructor-arg index="0" value="hello kevin"/>
</bean>
使用<constructor-arg>指定参数的方式有三种:
- 参数索引,如上
- 参数类型,除基本类型,须指定全限定名,如:<constructor-arg type="java.lang.String" value="Hello World!"/>
- 参数名,须编译时添加变量名信息,如:<constructor-arg name="message" value="Hello World!"/>
四、依赖注入
1、setter注入
<bean id="hello5" class="cn.matt.spring.ioc.HelloImpl">
<property name="name" value="Hello World!"/>
<property name="age" value="10"/>
</bean>
setter注入要求属性必须有setter方法,且方法名要遵循“JavaBean getter/setter 方法命名约定”
JavaBean本质是一个POJO类,但具有以下限制:
- 有公共的无参构造器
- 属性是private访问级别,不建议public
- 属性必要时通过一组setter(修改器)和getter(访问器)方法来访问
- setter方法,以“set” 开头,后跟首字母大写的属性名,如“setMesssage”,只有一个方法参数,方法返回值为“void”
- getter方法,以“get”开头,对于boolean类型一般以“is”开头,后跟首字母大写的属性名,如“getMesssage”,“isOk”
- 属性有连续两个大写字母开头,如“URL”,则setter/getter方法为:“setURL”和“getURL”
2、数组
<bean id="hello8" class="cn.matt.spring.ioc.HelloImpl">
<property name="wordArray">
<array value-type="java.lang.String">
<value>item1</value>
<value>item2</value>
</array>
</property>
</bean>
value-type 默认为java.lang.String,因此可省略
3、集合类注入
集合类注入分为list和set,对于collection类型,两者均可注入
<!-- list注入 -->
<bean id="hello6" class="cn.matt.spring.ioc.HelloImpl">
<property name="words">
<list value-type="java.lang.String">
<value>hi</value>
<value>pretty</value>
</list>
</property>
</bean> <!--set注入 -->
<bean id="hello7" class="cn.matt.spring.ioc.HelloImpl">
<property name="wordSet">
<set value-type="java.lang.String">
<value>hi</value>
<value>pretty</value>
</set>
</property>
</bean>
4、Map注入
<bean id="hello9" class="cn.matt.spring.ioc.HelloImpl">
<property name="wordMap">
<map key-type="java.lang.String" value-type="java.lang.String">
<entry key="a" value="abc" />
<entry key="x" value="xyz" />
</map>
</property>
</bean>
5、Properties注入
Properties的key、value均为String,不可变
<bean id="hello10" class="cn.matt.spring.ioc.HelloImpl">
<property name="properties">
<props>
<prop key="a">abc</prop>
<prop key="x">xyz</prop>
</props>
</property>
</bean>
6、注入bean
<bean id="bean1" class="java.lang.String">
<constructor-arg index="0" value="hello matt"/>
</bean> <bean id="hello12" class="cn.matt.spring.ioc.HelloImpl">
<property name="name" ref="bean1"/>
</bean>
7、内部bean
内部bean对外部不可见,不管是否指定id或name,spring都会指定唯一的匿名标识
<bean id="hello12" class="cn.matt.spring.ioc.HelloImpl">
<property name="name">
<bean id="bean2" class="java.lang.String">
<constructor-arg index="0" value="hello matt"/>
</bean>
</property>
</bean>
8、注入null值
<bean id="hello13" class="cn.matt.spring.ioc.HelloImpl">
<property name="name"><null /></property>
</bean>
五、其他配置
1、 延迟加载
<bean id="hello" class="cn.matt.HelloImpl" lazy-init="true"/>
2、init 与 destroy 方法
<bean id="hello" class="cn.matt.HelloImpl" init-method="init" destroy-method="destroy"/>
init-method="init" :指定初始化方法,在构造器注入和setter注入完毕后执行
destroy-method="destroy":指定销毁方法,只有“singleton”作用域能销毁,“prototype”作用域的一定不能
3、Bean的作用域
<!-- 单例 -->
<bean class="cn.matt.HelloImpl" scope="singleton"/> <!-- 原型 -->
<bean class="cn.matt.HelloImpl" scope="prototype"/>
singleton:指“singleton”作用域的Bean只会在每个Spring IoC容器中存在一个实例,而且其完整生命周期完全由Spring容器管理。对于所有获取该Bean的操作Spring容器将只返回同一个Bean。
prototype:即原型,指每次向Spring容器请求获取Bean都返回一个全新的Bean,相对于“singleton”来说就是不缓存Bean,每次都是一个根据Bean定义创建的全新Bean。
参考:
第二章 IoC 之 2.1 IoC基础 ——跟我学Spring3
第二章 IoC 之 2.2 IoC 容器基本原理 ——跟我学Spring3
第二章 IoC 之 2.3 IoC的配置使用——跟我学Spring3
第三章 DI 之 3.1 DI的配置使用 ——跟我学spring3
第三章 DI 之 3.3 更多DI的知识 ——跟我学spring3
第三章 DI 之 3.4 Bean的作用域 ——跟我学spring3
Spring 使用介绍(二)—— IoC的更多相关文章
- Spring的介绍与搭建
一.Spring的介绍 二.Spring的搭建 (1)导包 (2)创建一个对象 (3)书写配置注册对象到容器 (4)代码测试
- 一) Spring 介绍、IOC控制反转思想与DI依赖注入
一.spring介绍1.IOC反转控制思想(Inversion of Control)与DI依赖注入(Dependency Injection)2.AOP面向切面的编程思想与动态代理3.作用:项目的粘 ...
- Spring系列(二):Spring IoC应用
一.Spring IoC的核心概念 IoC(Inversion of Control 控制反转),详细的概念见Spring系列(一):Spring核心概念 二.Spring IoC的应用 1.定义B ...
- Spring升级案例之IOC介绍和依赖注入
Spring升级案例之IOC介绍和依赖注入 一.IOC的概念和作用 1.什么是IOC 控制反转(Inversion of Control, IoC)是一种设计思想,在Java中就是将设计好的对象交给容 ...
- Spring框架学习之IOC(二)
Spring框架学习之IOC(二) 接着上一篇的内容,下面开始IOC基于注解装配相关的内容 在 classpath 中扫描组件 <context:component-scan> 特定组件包 ...
- Spring框架annotation实现IOC介绍
Spring学习笔记(三) 续Spring 学习笔记(二)之后,对Spring框架的annotation实现方法进行整理 本文目录 @Autowire 1 @Autowire+@Qualifier t ...
- Spring(二)--IoC&AOP
IOC 一.IOC概述: 一般指控制反转(inversion of Control),把创建对象的权利交给框架,Ioc容器控制对象,是框架的重要特征,并非是面向对象编程的专用术语.它包括依赖注入(DI ...
- spring 学习 二 IOC/DI
中文名称:控制反转 英文名称:( Inversion of Control ) 1 控制反转作用: 一般在编写java程序时,需要程序员自己创建对象的实例,例如 A a=new A();语句,就是程序 ...
- Spring知识点总结(二)之Spring IOC
1.创建bean类,并在spring中进行配置交由spring来管理1. IOC(DI) - 控制反转(依赖注入) 所谓的IOC称之为控制反转,简单来说就是将对象的创建的权利及对象的生命周期的管 ...
- Spring 教程(二)
一.Spring AOP介绍 开发其实就是在不断的重构,抽象重复代码,然后进行封装.从最原始的模块化编程到面向对象编程,代码的封装越来越整齐清晰,但是依然存在重复的代码,而这些重复代码几乎都是与业务逻 ...
随机推荐
- JavaEE学习之Spring声明式事务
一.引言 上一篇文章,学习了AOP相关知识,并做了一个简单的Hello world.本文在上篇文章的基础上,进一步学习下Spring的声明式事务. 二.相关概念 1. 事务(Transaction)— ...
- MVC5+EF6入门教程——实现动态创建数据库与登录验证
详细步骤 创建文件夹,规划好项目目录 创建相关实体类 (Data Model) 创建 Database Context 创建Initializer, 使用EF初始化数据库,插入测试数据 实现数据库登录 ...
- ASP.Net Core 运行错误 Http Error 502.5 解决办法
Http Error 502.5 - Process Failure 如果你看到上面这张图片了的话,说明你在本地运行的时候报错了. 尤其好多都是我的群友,说下情况. 这个一般是本地的.NET Core ...
- netty同端口监听tcp和websocket协议
前言: 软件通信七层结构(osi模型)中由协议套协议最终组成最高级应用层协议(http等等),下三层结构偏向与数据通信,上三层更偏向于数据处理,中间的传输层则是连接上三层与下三层之间的桥梁,每一层都做 ...
- 通用权限管理系统多语言开发标准接口 - java,php 调用标准接口程序参考
1:公司里有多个业务系统,需要进行统一重构,有PHP的.有Java的.有.NET的,甚至还有 Delphi 的. 2:公司里有多个数据库系统,有mysql的.有sqlserver的.还有oracel的 ...
- python 获取gearbest地址库代码
import requests import json # 用来去掉多余的字符,并格式化 def geshihua(str): s = None if "/**/_get_country(& ...
- JVM的常用的调优策略和垃圾回收算法及Tomcat的常用调优参数
jvm调优主要针对堆内存,堆内存分为:新生区.养老区和永久区 永久区存放的是系统jdk自身的interface和class的元数据,所以唯有新生区和养老区具有优化空间. 新生区:伊甸区和幸存者区.所有 ...
- jmeter之批量修改请求路径
今天工作时碰到一个问题:测试环境中由于tomcat没指定webapps下的文件夹名,导致tomcat使用了webapps下默认的文件夹名,而我的jmeter脚本都已经做出来了,一共83个接口,挨个改路 ...
- Nginx会话保持之nginx-sticky-module模块
Nginx会话保持之nginx-sticky-module模块 - 天行健,君子以自强不息:地势坤,君子以厚德载物. - CSDN博客https://blog.csdn.net/huangjinjin ...
- java Date时间的各种转换方式和Mysql存时间类型字段的分析
一:各种Date之间的转换方法 public class TimeTest { public static void main(String[] args) { Date date = new Dat ...