欢迎来到天天文库
浏览记录
ID:34464953
大小:197.00 KB
页数:21页
时间:2019-03-06
《java spring各种依赖注入注解地区别》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实用文案Spring对于Bean的依赖注入,支持多种注解方式:@Resourcejavax.annotationJSR250(CommonAnnotationsforJava)@Injectjavax.injectJSR330(DependencyInjectionforJava)@Autowiredorg.springframework.bean.factorySpring直观上看起来,@Autowired是Spring提供的注解,其他几个都是JDK本身内建的注解,Spring对这些注解也进行了支持。
2、但是使用起来这三者到底有什么区别呢?笔者经过方法的测试,发现一些有意思的特性。区别总结如下:一、@Autowired有个required属性,可以配置为false,这种情况下如果没有找到对应的bean是不会抛异常的。@Inject和@Resource没有提供对应的配置,所以必须找到否则会抛异常。二、@Autowired和@Inject基本是一样的,因为两者都是使用AutowiredAnnotationBeanPostProcessor来处理依赖注入。但是@Resource是个例外,它使用的是Common
3、AnnotationBeanPostProcessor来处理依赖注入。当然,两者都是BeanPostProcessor。@Autowired和@Inject-默认autowiredbytype标准实用文案-可以通过@Qualifier显式指定autowiredbyqualifiername。-如果autowiredbytype失败(找不到或者找到多个实现),则退化为autowiredbyfieldname@Resource-默认autowiredbyfieldname-如果autowiredbyfiel
4、dname失败,会退化为autowiredbytype-可以通过@Qualifier显式指定autowiredbyqualifiername-如果autowiredbyqualifiername失败,会退化为autowiredbyfieldname。但是这时候如果autowiredbyfieldname失败,就不会再退化为autowiredbytype了。TIPSQualifiednameVSBeanname在Spring设计中,Qualifiedname并不等同于Beanname,后者必须是唯一的,但
5、是前者类似于tag或者group的作用,对特定的bean进行分类。可以达到getByTag(group)的效果。对于XML配置的bean,可以通过id属性指定beanname(如果没有指定,默认使用类名首字母小写),通过标签指定qualifiername:如果是通过注解方式,那么可以通过@Qualifier注解指定qualifiername,通过@Named或者@Component(@Service,@Repository等)的value值指定beanname:@Component("lamborghini")@Qualifier("luxury")publicclassLamborghiniimplementsCar{}或者标准实用文案@Component@Named("lamborghin
7、i")@Qualifier("luxury")publicclassLamborghiniimplementsCar{}同样,如果没有指定beanname,那么Spring会默认是用类名首字母小写(Lamborghini=>lamborghini)。三、通过Anotation注入依赖的方式在XML注入方式之前进行。如果对同一个bean的依赖同时使用了两种注入方式,那么XML的优先。但是不同担心通过Anotation注入的依赖没法注入XML中配置的bean,依赖注入是在bean的注册之后进行的。四、目前的
8、autowiredbytype方式(笔者用的是3.2.3.RELEASE版本),Spring的AutowiredAnnotationBeanPostProcessor实现都是有”bug”的,也就是说@Autowired和@Inject都是有坑的(称之为坑,不称之为bug是因为貌似是故意的。。)。这是来源于线上的一个bug,也是这边文章的写作原因。现场如下:application-context.xml中有如下定义:
此文档下载收益归作者所有