《Java Spring各种依赖注入注解的区别.doc》由会员分享,可在线阅读,更多相关《Java Spring各种依赖注入注解的区别.doc(23页珍藏版)》请在金锄头文库上搜索。
1、Spring对于Bean的依赖注入,支持多种注解方式:Resourcejavax.annotationJSR250 (Common Annotations for Java)Injectjavax.injectJSR330 (Dependency Injection for Java)Autowiredorg.springframework.bean.factorySpring直观上看起来,Autowired是Spring提供的注解,其他几个都是JDK本身内建的注解,Spring对这些注解也进行了支持。但是使用起来这三者到底有什么区别呢?笔者经过方法的测试,发现一些有意思的特性。区别总结如下:
2、一、Autowired有个required属性,可以配置为false,这种情况下如果没有找到对应的bean是不会抛异常的。Inject和Resource没有提供对应的配置,所以必须找到否则会抛异常。二、 Autowired和Inject基本是一样的,因为两者都是使用AutowiredAnnotationBeanPostProcessor来处理依赖注入。但是Resource是个例外,它使用的是CommonAnnotationBeanPostProcessor来处理依赖注入。当然,两者都是BeanPostProcessor。Autowired和Inject- 默认 autowired by typ
3、e- 可以 通过Qualifier 显式指定 autowired by qualifier name。- 如果 autowired by type 失败(找不到或者找到多个实现),则退化为autowired by field nameResource- 默认 autowired by field name- 如果 autowired by field name失败,会退化为 autowired by type- 可以 通过Qualifier 显式指定 autowired by qualifier name- 如果 autowired by qualifier name失败,会退化为 autow
4、ired by field name。但是这时候如果 autowired by field name失败,就不会再退化为autowired by type了。TIPS Qualified name VS Bean name在Spring设计中,Qualified name并不等同于Bean name,后者必须是唯一的,但是前者类似于tag或者group的作用,对特定的bean进行分类。可以达到getByTag(group)的效果。对于XML配置的bean,可以通过id属性指定bean name(如果没有指定,默认使用类名首字母小写),通过标签指定qualifier name: 如果是通过注解方
5、式,那么可以通过Qualifier注解指定qualifier name,通过Named或者Component(Service,Repository等)的value值指定bean name:Component(lamborghini)Qualifier(luxury)public class Lamborghini implements Car 或者ComponentNamed(lamborghini)Qualifier(luxury)public class Lamborghini implements Car 同样,如果没有指定bean name,那么Spring会默认是用类名首字母小写(L
6、amborghini=lamborghini)。三、 通过Anotation注入依赖的方式在XML注入方式之前进行。如果对同一个bean的依赖同时使用了两种注入方式,那么XML的优先。但是不同担心通过Anotation注入的依赖没法注入XML中配置的bean,依赖注入是在bean的注册之后进行的。四、目前的autowired by type方式(笔者用的是3.2.3.RELEASE版本),Spring的AutowiredAnnotationBeanPostProcessor实现都是有”bug”的,也就是说Autowired和Inject都是有坑的(称之为坑,不称之为bug是因为貌似是故意的。)
7、。这是来源于线上的一个bug,也是这边文章的写作原因。现场如下:application-context.xml中有如下定义: 其中static-field应用的常量定义在如下类中:package me.arganzheng.study.spring.autowired;public interface Constants public interface Language public static final String EN = CommonConstants.LANG_ENGLISH; public static final String JP = CommonConstants.LANG_JAPANESE; public static final String IND = CommonConstants.LANG_INDONESIAN; public static final String PT = Co