1、依赖注入(Dependency Injection)
public class A{
public void initMethod(){
B b = ...;// get a instance of B
b.func();
}
}
如示例代码,组件A中要使用组件B,必须先获取B的一个实例;若B是一个具体的类,只需通过new关键字创建B的实例;若B是一个接口,有多个实现,那么具体采用B的哪一个实现就不确定了。
依赖注入:接管对象的创建工作,将特定对象的引用注入到需要该对象的组件中。
1、 Java代码方式
1)Set方法注入
public class A{
private B b;
public void initMethod(){
b.func();
}
public void setB(B b){
this.b = b;
}
}
2)构造器注入
public class A{
private B b;
public A(B b){
this.b = b;
}
public void initMethod(){
b.func();
}
}
2、XML配置
1)构造器注入(constructor-arg)
<bean id="car" class="cn.demo.Car">
<!--
index:参数顺序
type:参数类型
name:参数名称
value:参数值
ref:引用的bean的id
-->
<constructor-arg index="0" type="java.lang.String" value="宝马"/>
</bean>
2)setter方法注入(property)
<bean id="car" class="cn.demo.Car">
<!--
name:参数名
value:参数值
ref:引用bean的id
-->
<property name="sid" value="10001"/>
<property name="sname" value="张三"/>
<property name="bike" ref="bike"/>
</bean>
3、注解
1)@Autowired,默认ByType
public class A{
@Autowired
private B b;
public void initMethod(){
b.func();
}
}
2)@Resource,默认ByName
public class A{
@Resource
private B b;
public void initMethod(){
b.func();
}
}
2、IoC装配Bean
概念:解决程序对象耦合的问题,将程序构造对象的权限交给IoC容器。
1)无参构造器
<!--
id:bean的id
name:bean的名称
class:bean的类名
init-method:对象构造后执行的方法
destroy-method:容器销毁后执行的方法,默认不执行,必须手动调用applicationContext.close();
-->
<bean id="person" class="cn.demo.Person" init-method="setup" destroy-method="teardown"/>
2)工厂方法
<bean id="person" class="cn.demo.Person" factory-method="getInstance" />
3、Spring的核心工厂
BeanFactory和子接口ApplicationContext,getBean方法执行时,实例化一个Bean。
ApplicationContext context = new ClassPathApplicationContext(new String[]{"spring-config.xml"});
Person person = context.getBean("person", Person.class);
4、其他注解
@PostConstruct:初始化之后执行的方法,同init-method
@PreDestroy:销毁之前执行的方法,同destroy-method
@Scope:指定bean的作用域
5、Bean的作用域
- singleton
在IoC容器中仅存在一个Bean,Bean以单例模式存在。 - prototype
每次从容器getBean时,都返回一个新的Bean,即new XXX(); - request
每次Http请求都会创建一个Bean,仅适用于WebApplicationContext环境。 - session
同一个HttpSession共享一个Bean,不同session使用不同的Bean,仅适用于WebApplicationContext环境。 - globalSession
一般用于Porlet应用环境,适用于WebApplicationContext环境。