spring2.5注解驱动(一)@Autowired and @Resource
注释配置相对于 XML 配置具有很多的优势:?
它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名、类型等信息,如果关系表字段和 PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取。?
注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放在一起,有助于增强程序的内聚性。而采用独立的 XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。?
因此在很多情况下,注释配置比 XML 配置更受欢迎,注释配置有进一步流行的趋势。Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分 XML 配置的功能。
@Autowired,按照类型注入
@Resource,默认按照名称注入,如果名称没有指定,则按照类型注入
@Resource 的作用相当于 @Autowired,只不过 @Autowired 按 byType 自动注入,面 @Resource 默认按 byName 自动注入罢了。@Resource 有两个属性是比较重要的,分别是 name 和 type,Spring 将 @Resource 注释的 name 属性解析为 Bean 的名字,而 type 属性则解析为 Bean 的类型。所以如果使用 name 属性,则使用 byName 的自动注入策略,而使用 type 属性时则使用 byType 自动注入策略。如果既不指定 name 也不指定 type 属性,这时将通过反射机制使用 byName 自动注入策略。
Java代码
package ?com.baobaotao;??? ???
public ? class ?Office?{??? ???
???? private ?String?officeNo?=” 001 ”;??? ???
?? ???
???? //省略?get/setter??? ???
?? ???
???? @Override ?? ???
???? public ?String?toString()?{??? ???
???????? return ? "officeNo:" ?+?officeNo;??? ???
????}??? ???
}????
?
package ?com.baobaotao;??? ???
?? ???
public ? class ?Car?{??? ???
???? private ?String?brand;??? ???
???? private ? double ?price;??? ???
?? ???
???? //?省略?get/setter??? ???
?? ???
???? @Override ?? ???
???? public ?String?toString()?{??? ???
???????? return ? "brand:" ?+?brand?+? "," ?+? "price:" ?+?price;??? ???
????}??? ???
}????
?
package ?com.baobaotao;??? ???
?? ???
public ? class ?Boss?{??? ???
???? private ?Car?car;??? ???
???? private ?Office?office;??? ???
?? ???
???? //?省略?get/setter??? ???
?? ???
???? @Override ?? ???
???? public ?String?toString()?{??? ???
???????? return ? "car:" ?+?car?+? "\n" ?+? "office:" ?+?office;??? ???
????}??? ???
}?????
普通xml配置
<?xml?version= "1.0" ?encoding= "UTF-8" ??>?? ???
<beans?xmlns= "http://www.springframework.org/schema/beans" ?? ???
????xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" ?? ???
????xsi:schemaLocation="http: //www.springframework.org/schema/beans???? ???
?http: //www.springframework.org/schema/beans/spring-beans-2.5.xsd">?? ???
????<bean?id= "boss" ? class = "com.baobaotao.Boss" >?? ???
????????<property?name= "car" ?ref= "car" />?? ???
????????<property?name= "office" ?ref= "office" ?/>?? ???
????</bean>?? ???
????<bean?id= "office" ? class = "com.baobaotao.Office" >?? ???
????????<property?name= "officeNo" ?value= "002" />?? ???
????</bean>?? ???
????<bean?id= "car" ? class = "com.baobaotao.Car" ?scope= "singleton" >?? ???
????????<property?name= "brand" ?value= "?红旗?CA72" />?? ???
????????<property?name= "price" ?value= "2000" />?? ???
????</bean>?? ???
</beans>?
使用 @Autowired 注释 ,必须在dtd中声明,否则会出现异常
Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
@Autowired 按照类型来装配
改变如下:
package ?com.baobaotao;??? ???
import ?org.springframework.beans.factory.annotation.Autowired;??? ???
?? ???
public ? class ?Boss?{??? ???
?? ???
???? @Autowired ?? ???
???? private ?Car?car;??? ???
?? ???
???? @Autowired ?? ???
???? private ?Office?office;??? ???
?? ???
????…??? ???
}?
<?xml?version= "1.0" ?encoding= "UTF-8" ??>?? ???
<beans?xmlns= "http://www.springframework.org/schema/beans" ?? ???
????xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" ?? ???
????xsi:schemaLocation="http: //www.springframework.org/schema/beans???? ???
?http: //www.springframework.org/schema/beans/spring-beans-2.5.xsd">?? ???
?? ???
????<!--?该?BeanPostProcessor?将自动起作用,对标注? @Autowired ?的?Bean?进行自动注入?-->?? ???
????<bean? class ="org.springframework.beans.factory.annotation.??? ???
????????AutowiredAnnotationBeanPostProcessor"/>?? ???
?? ???
????<!--?移除?boss?Bean?的属性注入配置的信息?-->?? ???
????<bean?id= "boss" ? class = "com.baobaotao.Boss" />?? ???
???? ???
????<bean?id= "office" ? class = "com.baobaotao.Office" >?? ???
????????<property?name= "officeNo" ?value= "001" />?? ???
????</bean>?? ???
????<bean?id= "car" ? class = "com.baobaotao.Car" ?scope= "singleton" >?? ???
????????<property?name= "brand" ?value= "?红旗?CA72" />?? ???
????????<property?name= "price" ?value= "2000" />?? ???
????</bean>?? ???
</beans>???
这样,当 Spring 容器启动时,AutowiredAnnotationBeanPostProcessor 将扫描 Spring 容器中所有 Bean,当发现 Bean 中拥有 @Autowired 注释时就找到和其匹配(默认按类型匹配)的 Bean,并注入到对应的地方中去。?
按照上面的配置,Spring 将直接采用 Java 反射机制对 Boss 中的 car 和 office 这两个私有成员变量进行自动注入。所以对成员变量使用 @Autowired 后,您大可将它们的 setter 方法(setCar() 和 setOffice())从 Boss 中删除。?
当然,您也可以通过 @Autowired 对方法或构造函数进行标注,来看下面的代码
将注解@Autowired放在方法上
package ?com.baobaotao;??? ???
?? ???
public ? class ?Boss?{??? ???
???? private ?Car?car;??? ???
???? private ?Office?office;??? ???
?? ???
????? @Autowired ?? ???
???? public ? void ?setCar(Car?car)?{??? ???
???????? this .car?=?car;??? ???
????}??? ???
???? ???
???? @Autowired ?? ???
???? public ? void ?setOffice(Office?office)?{??? ???
???????? this .office?=?office;??? ???
????}??? ???
????…??? ???
}???
将 @Autowired 注释标注在构造函数上
package ?com.baobaotao;??? ???
?? ???
public ? class ?Boss?{??? ???
???? private ?Car?car;??? ???
???? private ?Office?office;??? ???
???? ???
???? @Autowired ?? ???
???? public ?Boss(Car?car?,Office?office){??? ???
???????? this .car?=?car;??? ???
???????? this .office?=?office?;??? ???
????}??? ???
???? ???
????…??? ???
}?
?
原文地址?http://blog.163.com/www_jiangtao/blog/static/24915273201061992240217/
-------------------------------
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
?