Spring 3.0 注解注入详解
一、各种注解方式
1.@Autowired注解(不推荐使用,建议使用@Resource)
???? @Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作。@Autowired的标注位置不同,它们都会在Spring在初始化这个bean时,自动装配这个属性。要使@Autowired能够工作,还需要在配置文件中加入以下
?
? 2. @Qualifier注解
??? @Autowired是根据类型进行自动装配的。例如,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。如下:
?? 1). 可能存在多个UserDao实例????????@Resource装配顺序:
??? a.如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
??? b.如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
??? c.如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
??? d.如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;
4. @PostConstruct(JSR-250)注解
??? 在方法上加上注解@PostConstruct,这个方法就会在Bean初始化之后被Spring容器执行(注:Bean初始化包括,实例化Bean,并装配Bean的属性(依赖注入))。它的一个典型的应用场景是,当你需要往Bean里注入一个其父类中定义的属性,而你又无法复写父类的属性或属性的setter方法时,如:?<context:annotation-config />将隐式地向Spring容器注册了
AutowiredAnnotationBeanPostProcessor 、
CommonAnnotationBeanPostProcessor 、
PersistenceAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
这4个BeanPostProcessor。
2.使用<context:component-scan />让Bean定义注解工作起来?这里,所有通过<bean>元素定义Bean的配置内容已经被移除,仅需要添加一行<context:component-scan />配置就解决所有问题了——Spring XML配置文件得到了极致的简化(当然配置元数据还是需要的,只不过以注释形式存在罢了)。<context:component-scan />的base-package属性指定了需要扫描的类包,类包及其递归子包中所有的类都会被处理。
<context:component-scan />还允许定义过滤器将基包下的某些类纳入或排除。Spring支持以下4种类型的过滤方式:
过滤器类型 | 表达式范例 | 说明
注解 | org.example.SomeAnnotation | 将所有使用SomeAnnotation注解的类过滤出来
类名指定 | org.example.SomeClass | 过滤指定的类
正则表达式 | com\.kedacom\.spring\.annotation\.web\..* | 通过正则表达式过滤一些类
AspectJ表达式 | org.example..*Service+ | 通过AspectJ表达式过滤一些类
以正则表达式为例,我列举一个应用实例:?值得注意的是<context:component-scan />配置项不但启用了对类包进行扫描以实施注释驱动Bean定义的功能,同时还启用了注释驱动自动注入的功能(即还隐式地在内部注册了AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor),因此当使用<context:component-scan />后,就可以将<context:annotation-config />移除了。
3.<tx:annotation-driven/>
?? <context:annotation-config />是不支持spring的@Transcation和EJB的Spring's @Transactional or EJB3's @TransactionAttribute annotation。用此配置可以达到目的。
4. 使用@Scope来定义Bean的作用范围
在使用XML定义Bean时,我们可能还需要通过bean的scope属性来定义一个Bean的作用范围,我们同样可以通过@Scope注解来完成这项工作:?
一直想尝试下注解方式。 3 楼 爪哇岛岛主 2011-04-18 很明显,楼主,你的第一条我就不赞同!(下面的我没看)
@Autowired这个注解是Spring自带的,而@Resource是jdk1.5以上版本提供的,如果叫你用Spring MVC或者是Spring IOC的话,你会用Spring自带的东西还是反过来用jdk1.5提供的呢?显然是尽量用Spring提供的功能咯! 4 楼 17ZOUGUO 2011-04-18 爪哇岛岛主 写道很明显,楼主,你的第一条我就不赞同!(下面的我没看)
@Autowired这个注解是Spring自带的,而@Resource是jdk1.5以上版本提供的,如果叫你用Spring MVC或者是Spring IOC的话,你会用Spring自带的东西还是反过来用jdk1.5提供的呢?显然是尽量用Spring提供的功能咯!
我很菜,所以只能写我所知道的知识,如果你什么都懂,为什么还会看我的文章?难道蛋疼? 5 楼 爪哇岛岛主 2011-04-18 17ZOUGUO 写道爪哇岛岛主 写道很明显,楼主,你的第一条我就不赞同!(下面的我没看)
@Autowired这个注解是Spring自带的,而@Resource是jdk1.5以上版本提供的,如果叫你用Spring MVC或者是Spring IOC的话,你会用Spring自带的东西还是反过来用jdk1.5提供的呢?显然是尽量用Spring提供的功能咯!
我很菜,所以只能写我所知道的知识,如果你什么都懂,为什么还会看我的文章?难道蛋疼?
不好意思 6 楼 hastune 2011-04-20 引用.@Autowired注解(不推荐使用,建议使用@Resource)
博主可以详细说说byName方式为什么比byType方式好
:) 7 楼 duan1823a 2011-04-20 呵呵,好久没用有些都忘了~可能用来当备忘... 8 楼 cobb.chan 2011-04-24 目前在使用注解,回过头来看看,更有体会... 9 楼 yzhw 2011-05-04 好久不用了,都忘了 10 楼 finallygo 2011-05-12 爪哇岛岛主 写道很明显,楼主,你的第一条我就不赞同!(下面的我没看)
@Autowired这个注解是Spring自带的,而@Resource是jdk1.5以上版本提供的,如果叫你用Spring MVC或者是Spring IOC的话,你会用Spring自带的东西还是反过来用jdk1.5提供的呢?显然是尽量用Spring提供的功能咯!
我们程序的依赖应该优先依赖于JDK,之后才是依赖与SPRING这些第三方框架,JDK中的是一个规范,就好比,为什么我们在用Hibernate中使用的注解都是javax.persistence下的而不是自己定义的呢?因为这个J2EE的规范,所以hibernate也会更加倾向于使用已经规范的东西,而不是自己完全定义一套
比如你可以看链接: 11 楼 finallygo 2011-05-12 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html