依赖注入或者说是控制反转,说白了就是使用了配置文件,这种思想的最大的好处就是增加了模块的重用性灵活性。下面介绍几种依赖注入的方式:
Spring提供的Setter注入是最常用的一种Bean注入法,通过Setter注入后,直接将Bean的属性值输出在页面中
1.当前Bean对象要注入到哪个对象中,就需要在哪个对象中为当前这个对象设置私有属性,并设置属性的getter返回器和setter设置器。如:User对象注入到TestUtil对象中,那么就需要在TestUtil类中设置User对象属性,并设置getter()和setter()方法,TtstUtil类的代码如下:
public class TestUtil{
private User user;
public User getUser(){
return user;
}
public void setUser(User user){
this.user=user;
}
}
2.在Spring的xml配置文件中,通过<bean>标签对Bean进行依赖注入配置。<bean>标签的属性主要有两个,id属性用于配置Bean的唯一标识,Bean在注入的时需要根据这个标识查找Bean对象;class属性用于指定完整的Bean类。代码如下:
<!--为User对象属性赋值 - ->
<bean id="user" class="com.lh.entity.User"/>
<!-- 配置TestUtil,注入User -->
<bean id="testUtil" class="com.lh.util.TestUtil">
<property name="user" ref="user"/>
</bean>
二、应用构造器注入法
类在被实例化的时候,其构造方法将被调用并且只能调用一次。因此构造器常被用于类的初始化操作。
1.在TestUtil类中创建一个构造方法,并传递一个User参数
public class TestUtil{
private User user;
Public TestUtil(User user){ //构造方法
This.user =user;
}
Public boolean getUserInfo(){
If(user != null) {
Return true;
} else{
Return false;
}
}
}
2.Spring中的<constructor-arg>是<bean>元素的子元素,通过该元素可以实现为当前业务对象注入其所依赖的对象。xml中的配置如下:
<!--为User对象属性赋值 - ->
<bean id="user" class="com.lh.entity.User"/>
<!-- 配置TestUtil,注入User -->
<bean id="testUtil" class="com.lh.util.TestUtil">
<constructor-arg >
<ref bean="user">
</constructor-arg>
</bean>
三、应用@Autowired注解实现Bean的注入
可以利用Spring提供的@Autowired注解实现Bean的注入。@Autowired注解实现依赖注入时,可以标注于以下4种不同的情况。
(1)可以在类的构造方法上标注@Autowired注解,实现Bean的注入。如:
Public class TestUtil{
private User user; //声明要注入的对象
@Autowired
Public TestUtil(User user){ //构造方法
this.user = user;
}
}
(2)将@Autowired注解标注于属性,实现Bean的注入。在标注属性时,这个属性需要提供getter和setter方法,如:
Public class TestUtil {
@Autowired
private User user;
public User getUser(){
Return user;
}
Public void setUser(User user) {
this.user =user;
}
}
(3)将@Autowired注解标注于setter方法之上,实现Bean的注入,如:
Public class TestUtil {
private User user;
public User getUser(){
Return user;
}
@Autowired
Public void setUser(User user) {
this.user =user;
}
}
(4)将@Autowired注解标注于任意方法之上(只要改方法定义了需要被注入的参数即可实现Bean的注入)
Public class TestUtil {
private User user;
@Autowired
Public void setUser(User user) {
this.user =user;
}
}
@Resource与@Autowired注解类似,除了可以直接在属性域上标注@Resource,还可以在构造方法或者普通方法定义标注@Resource。
1.将TestUtil类中将@Autowired注解修改为@Resource注解,如
Public class TestUtil {
@Resource(name="book") //指定要注入的对象,book为Spring配置文件中定义的Bean的id
Private Book book ;
Public Book book;
Public Book getBook() {
Return book;
}
Public void setBook(Book book) {
this.book =book;
}
}
2.然后在Spring的配置文件中队Bean进行配置。针对@Resource注解,在配置文件中还需要配置
CommonAnnotationBeanPostProcessor,只有这样使用的@Resource注解发挥作用。如:
<beans>
<bean class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/>
<!-- 配置User对象 -->
<bean id="book" class="com.lh.util.Book"/>
<!-- 配置TestUtil -->
<bean id="testUtil" class="com.lh.util.TestUtil"/>
</beans>
不管是使用@Resource或@Autowired注解,都需要添加相应的BeanPostProcessor容器,但如果使用
<context:annotation-config>的话,就不必配置BeanPostProcessor了,因为<context:annotation-config>已经把
AutowiredAnnotationBeanPostProcess和CommonAnnotationBeanPostProcessor注册到容器了。
小结:
Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。我们可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。