spring依赖注入的几种方式
使用构造器注入
使用属性setter方法注入
使用Field注入(用于注解方式)
注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
1.手工装配依赖对象
手工装配依赖对象,在这种方式中又有两种编程方式
xml配置文件中,通过在bean节点下配置
java代码中使用@Autowired@Resource注解方式进行装配
依赖注入--手工装配--XML方式
通过setter方法注入依赖
<bean>元素的< property >子元素指明了使用它们的set方法来注入。可以注入任何东西,从基本类型到集合类,甚至是应用系统的bean
通过setter方法注入依赖
简单bean配置
配置bean的简单属性,基本数据类型和String
<bean id="personService" class="st.bean.impl.PersonServiceImpl">
<!-- 基本类型,string类型 -->
<property name="age"value="20"></property>
<property name="name" value="张无忌"></property>
</bean>
通过setter方法注入依赖
*引用其它bean
<beanid="person"class="st.bean.Person" />
<beanid="personService"
class="st.bean.impl.PersonServiceImpl">
<!-- 引用类型 -->
<propertyname="person" ref="person" />  ref:表示引用别的对象
</bean>
* 内部bean
<beanid="personService"class="st.bean.impl.PersonServiceImpl">
<!-- 内部bean注入 -->
<propertyname="personClass">
<beanclass="st.bean.PersonClass" />
</propert>
</bean>
这种方式的缺点是你无法在其它地方重用这个personClass实例,原因是它是专门为personService而用。
*装配集合
resource和autowired注解的区别若bean的属性是集合类型,按如下处理:
A、装配List和数组:
<!-- 装配list -->
<property name="lists">
<list>
<value>list1</value>
<value>list2</value>
<ref bean="person"/>
</list>
</property>
<!--装配数组 -->
<property name="obj">
<list>
<value>obj1</value>
<value>obj2</value>
<refbean="person"/>
</list>
</property>
B 装配set
<!--装配set -->
<property name="sets">
<set>
<value>set1</value>
<value>set2</value>
<refbean="person"/>
</set>
</property>
set使用方法和list一样,不同的是对象被装配到set中,而list是装配到List或数组中装配。
*装配集合
C、装配map
<!-- 装配map-->
<propertyname="maps">
<map>
<entry key="01">
<value>map01</value>
</entry>
<entry key="02">
<value>map02</value>
</entry>
</map>
</property>
map中的<entry>的数值和<list>以及<set>的一样,可以使任何有效的属性元素,需要注意的是key值必须是String的。
D、装配Properties
<!--装配Properties  -->
<property name="props">
<props>
<prop key="01">prop1</prop>
<prop key="02">prop2</prop>
</props>
</property>
E、设置null
<!--装配null -->
<property name="listnull">
<null/>
</property>
通过参数的顺序:
<constructor-argindex="0">
<value>张三</value>
</constructor-arg>
<constructor-argindex="1">
<value>56</value>
</constructor-arg>
通过构造函数注入依赖
<!--通过参数的类型 -->
<constructor-argtype="java.lang.Integer">
<value>56</value>
</constructor-arg>
<constructor-argtype="java.lang.String">
<value>张三</value>
</constructor-arg>
依赖注入--手工装配注解方式
java代码中使用@Autowired@Resource注解方式进行装配的前提条件是。
1、引入context命名空间 需要在xml配置文件中配置以下信息:
<beansxmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:context="/schema/context"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-2.5.xsd
/schema/context
/schema/context/spring-context-2.5.xsd">
<context:annotation-config/>
</beans>
2、在配置文件中添加context:annotation-config标签
<context:annotation-config/>
这个配置隐式注册了多个对注释进行解析处理的处理器
AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessorRequiredAnnotationBeanPostProcessor
注: @Resource注解在spring安装目录的lib\j2ee\common-annotations.jar
java代码中使用@Autowired@Resource注解方式进行装配,这两个注解的区别是:@Autowired 默认按类型装配,
@Resource默认按名称装配,当不到与名称匹配的bean才会按类型装配。
@Autowired
privatePersonDao  personDao;//用于字段上
@Autowired
publicvoid setPersonDao(PersonDaopersonDao) { //用于属性的set方法上
this.personDao = personDao;
}
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false
@Autowired(required=false)
privatePersonDao  personDao;//用于字段上
@Autowired(request=false)
public voidsetPersonDao(PersonDaopersonDao) {  //用于属性的set方法上
this.personDao = personDao;
}
如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:
@Autowired@Qualifier("personDao")
privatePersonDao  personDao;//用于字段上
@Autowired
publicvoidsetPersonDao(@Qualifier("personDao") PersonDao personDao) {//用于属性的set方法上
this.personDao= personDao;
}
@Qualifier注解也能够被指定为构造器的参数或者方法的参数:
@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上.
@Resource注解默认按名称装配。
名称可以通过@Resourcename属性指定,如果没有指定name属性,
当注解标注在字段上,即默认取字段的名称作为bean名称寻依赖对象
当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻依赖对象。
@Resource(name="personDao")
privatePersonDaopersonDao;//用于字段上
@Resource(name="personDao")
publicvoidsetPersonDao(PersonDao personDao) {//用于属性的set方法上
this.personDao = personDao;
}
后一种相当于xml配置文件中的
<propertyname=“personDao"ref="personDao" />

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。