几个概念解析:
1.Spring的依赖三种依赖注入方式:
使用构造器注入
使用属性setter方法注入
使用Field方式注入(用于注解方式)
2.注入依赖对象可以使用手工装配和自动装配,在实际应用在建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预知最终的装配结果。
(1)手工装配依赖对象的两种编程方式:
在XML配置文件中通过bean节点的方式实现;
<span style="white-space:pre"> </span><bean id="personDaoxxxx" class="xjj.dao.impl.PersonDaoBean"></bean> <span style="white-space:pre"> </span><bean id="personService" class="xjj.service.impl.PersonServiceBean"> <span style="white-space:pre"> </span><constructor-arg index="0" type="cn.itcast.dao.PersonDao" ref="personDao"/> <span style="white-space:pre"> </span><constructor-arg index="1" value="xjj"/> </bean>
在java代码中使用@Autowired,@Resourced等注解方式进行装配;
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <context:annotation-config/>
(2)自动装配方式
<bean id="personService" class="xjj.service.impl.PersonServiceBean" autowire="byType">
byType:在容器中寻找一个与需要自动装配的属性类型相同的Bean,如没有找到相符Bean,该属性就没有被装配上,如果找到超过一个相符的Bean时(不能出现有继承的两个类),会抛出No unique bean of type的异常;
byName:在容器中寻找和需要自动装配的属性名相同的Bean(或ID),如果没有找到相符的Bean,该属性就没有被装配上;
注意:byName和byType使用前要有一个默认的构造器,必须保证Bean能够初始化,否则的话会出现异常;
constructor:在容器中寻找与需要自动装配的Bean的构造方法参数一致的一个或多个Bean。如存在不确定Bean或构造方法,容器会抛出org.springframework.bean.unisatisfiedBependencyException异常。通过构造器注入的,构造器中的参数是按照byType装配的.;
autodetect:通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器那么将使用byType方式。
@Resource注解
为什么选择注解的方式对依赖对象进行注入呢?由于在XML配置文件中通过bean节点的方式进行装配时,当项目比较庞大时,随着bean的个数增多,bean对应的属性就会成千上万,最终xml文件就会很臃肿,这时为了给配置文件”瘦身“,这时注解的方式产生了。
现在看看使用注解的方式如何实现:
首先,加入两个命名空间,因为我们要打开使用注解方式的配置项: <context:annotation-config/>,由于该配置项annotation-config是在context命名空间下的,因此需要引入context命名空间以及它的schema文件。
xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
这个配置项的作用:隐式注册了多个对注释进行解析的处理器,注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。
AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、
PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor
注:@Resource注解在common-annotations.jar包下.
@Autowired与@Resource的区别,使用其中任何一个注解就可以了。
1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2、@Autowired默认按类型装配,如果我在personDao 字段上加了@Resource注解,那么就会默认取personDao 字段的类型在Spring容器中寻找与这个类型匹配的bean,寻找到对应的bean之后就会把这个bean注入到该字段上来。默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
@Autowired() @Qualifier("baseDao")
private PersonDao personDao ;
3、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。