spring的依赖注入

    依赖注入是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>


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值