您的位置:首页 > 编程语言 > Java开发

Spring2.5学习3.1_用@Resource注解完成属性装配

2015-06-03 20:49 786 查看
几个概念解析:

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属性一旦指定,就只会按照名称进行装配。

用@Resource注解PersonDao,由于没有添加name属性,故按照字段名personDao进行查找;

@Resource
private PersonDao personDao;
配置文件中,没找到与字段名一致的bean,再根据类型进行装配;

<bean id="personDaoxxxx" class="xjj.dao.impl.PersonDaoBean"></bean>
          <bean id="personService" class="xjj.service.impl.PersonServiceBean" ></bean>


结果:装配成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: