spring的依赖注入

来源:互联网 发布:linux 查看网卡状态 编辑:程序博客网 时间:2024/05/16 05:17

    依赖注入是spring 的IOC 容器中一个核心概念。它本质上来管理对象数据的填充和对象之间的关联关系。通过依赖注入,应用程序本身不会主动向容器请求资源,容器会自动把这些对象给应用程序。

  IOC容器的核心思想是Spring提供的Bean工厂(SessionFactory)。在spring中,bean工厂创建的各个实例称作Bean。Bean工厂负责读取Bean定义文件,管理对象的加载,生成,维护Bean对象与其他Bean对象的依赖关系,负责Bean的生命周期。对于简单的应用程序来说,使用BeanFactory就已经足够来管理Bean了,在对象的管理上就可以获得许多的便利,而很少看到new语句。

      我们以创建一个用户服务Bean的配置为例:

 

<bean id="UserBean" class="com.leec.ylss.user.UserBean"> </bean>

  id是唯一标识属性,一个spring容器中只能有一个该id为指定值的Bean,其他的Bean如果依赖注入该Bean,也要使用id属性。默认情况下,SessionFactory产生的Bean实例采用的是单例模式,也就是说一个IOC容器针对某个Bean产生的对象只能有一个。

  在上面的配置中,并没有其他任何对象或数据的依赖注入。spring的bean可以包含各类属性,这些属性影响着bean的行为。例如,string类型的配置属性、其他bean的引用、列表、集合等。bean工厂在创建bean时,根据配置文件的设置将这些属性都装配好。spring的依赖注入的方式有两种:setter方法和构造方法。我一般使用的是setter方法,这里就介绍一下setter方法吧。

  Bean需要按照javaBean的可写属性的setter方法的规范来定义。spring会利用反射机制,在Bean构建好以后,调用setter方法,把属性的值设置给Bean实例。例如,一下是一个用户Bean,它包含一个名为str的可写属性,具体如下:

       首先,我们要定义一个UserBean类,里面有一private类型的属性str,并且,对着属性写setter和getter方法。

      然后,就可以在配置文件中为str属性赋值,代码如下:

 
<bean id="UserBean" class="com.leec.ylss.user.UserBean">       <property name="str" value="hello">  </property>  
</bean>


这里name的值应该与javaBean规范规定的属性名相同,然后用value属性设这它的值为“hello”。除了字符串类型,整型、浮点型、布尔型等,基础类型的属性也是可以通过配置来完成装配,甚至链表、集合这样的java容器也是可以通过配置的方式来配置,一下是list类型的属性的装配配置实例:

<bean id="UserBean" class="com.leec.ylss.userU.serBean">     <property name="listProperty"><list>    <value>1</value>    <value>2</value>    <value>2</value></list>      </property></bean>

 

如果饮用是另外的Bean的话,就要使用ref或bean属性了。通过setter方法为UserBean设置UserDaoBean的配置实例:


 

<bean id="UserBean" class="com.leec.ylss.userU.serBean">     <property name="UserDao" ref="UserDao"></property>     <bean id="UserDao" class="UserDao" </bean>                    </property></bean>


ps:但凡使用<property>标签来装配bean的属性,必须在Bean类中加上setter方法。

 

还有一种方式,就是构造方法注入。两者比较起来,构造方法在构建对象的同时,把依赖关系也构建好,对象创建好以后就已经准备好了所有的资源,安全性更高一些。而setter方法创建完对象之后再通过set方法进行属性的设定,更加灵活一些。

  构造方法注入是在创建Bean实例时,通过调用Bean的构造方法来注入属性的值。它使用的是<constructor-arg>标签,也可以通过<value>标签或 <ref>标签来指定属性或引用的Bean的实例。示例:

public class ConTestBean{//成员变量private String str;//UserBean的引用private UserBean userbean;//包含两个参数的构造方法public ConTestBean(String str,UserBean userbean){this.str=str;this.UserBean=userbean;}...}


 

通过构造方法注入ConTestBean需要的属性代码如下:

   <!-- 配置ConTestBean,采用构造方法注入属性 --><bean id="ConTestBean" class="ConTestBean">    <!-- 需要指定构造方法参数的下表位置,从0开始--><constructor-arg index="0"><value>hello</value></constructor-arg><constructor-arg index="1"><!-- userBean是另一个bean实例 --><ref="userBean"/></constructor-arg></bean>


 

原创粉丝点击