了解下Spring依赖注入几个常用注解

了解下Spring依赖注入几个常用注解,第1张

开发中经常用到的注解有以下几个:

①:@Autowired:是(JSR-330)javax.inject.inject的替代形式,实现Spring依赖注入的一种形式,可以装配对象,设置对象依赖,注入Setter方法,找到多个Bean对象时需要用@Qualifier限定使用哪个Bean。

使用示例:

方式1:

备注:required=true代表依赖是必须的,false代表依赖不是必然的。

方式2:

备注:当存在多个Bean实例时@Qualifier起到指定候选Bean的作用。

如何注入对象的同时再设置被注入对象的属性值。

可以有三种形式,作用都一样,只不过其代理实现机制不一样而已。

源码分析:

@Autowired由AutowiredAnnotationBeanPostProcessor实现,它里面有两个重要的内部类,AutowiredFieldElement和AutowiredMethodElement,这两个类都继承自InjectionMetadata.InjectedElement,并重写了inject(注入方法),这两个类的作用一个是注解在属性字段的注入,另一个是注解在方法上的注入。

简单说一下这个类里面的其他方法是做什么用的。

Method:findAutowiringMetadata->找到所有装配的元数据

Method:registerDependentBeans ->将指定的Bean注册它的依赖Bean(比方说xxService注册到xxController中去)

②:@Resource:资源标记注解,由J2EE提供的注解(javax.annotation.Resource)。当组件初始化时,容器将向应用程序组件注入请求资源的实例。重点就是:标记应用程序所需的资源,资源在Spring中可能以Component,Service,以@Bean注入形式等。@Resource默认是ByName方式注入资源。

特性:支持byName,byType多种形式。

@Resource注解核心实现实在类CommonAnnotationBeanPostProcessor中实现的,我们就简单说一下这个类针对Resource做了什么用。

通过查看源码得出,里面有一个内部类:ResourceElement,还有一个重要方法:buildResourceMetadata->构建ResourceMetaData(Resource元素据)

@Resource和@Autowired的相同点:

①:都是注解形式,都可以用来依赖注入,都可以以配置在属性上的形式依赖一个Bean,也可以以Setter形式注入一个Bean.两者的注入形式都可以被javax.inject.Inject注解取代。

②:两者都依赖于Spring上下文,都需要先获取BeanFacotry之后,再由BeanFactory去解析Bean,装配Bean等动作。

③:他们俩都可以配置延时加载(以@Lazy配置使用,这样做时用到时才会装配,才会报错,与懒加载是一层意思。

@Resource和@Autowired的不同点:

①:来源不同,@Resource是J2EE里面的注解,不依赖于Spring.

@Autowired是来自于Spring-Beans里面的注解,必须在Spring容器中才能使用,并依赖于Spring上下文。

②:使用的范围@Resource比@Autowired更广泛,@Resource除了ByType之外还可以ByName。@Resource指定name时相当于@Autowired与@Qualifer组合使用.

③:@Resource可以设置一定的容错性,可以配置lookUp,可以指定Type来装配。

是java自带的注解,有两个属性name 和 type,Spring支持使用@Resource来注入。

1、加到类的属性字段上,默认会使用反射机制来实现注入;

2、原则上要加到类的属性set方法上。

1、加到类的属性字段上,默认的name是属性名称,默认的type是属性类型

2、加到类的属性set方法上,默认的name是方法名去掉set后将其首字母小写 或 方法的参数名称(2个有一个存在即可),默认的type就是set方法的参数类型。

1、都不显示指定时,默认先按照byName,再按照byType来查找类并注入

2、显示指定了name,则只会按照byName查找类并注入

3、显示指定了type,则只会按照byType查找类并注入

4、都指定时,则查找同时满足byName和byType的类并注入

byName的原则,查找beanId等于指定的名称的bean,找不到则抛出异常。

byType的原则,查找指定的类、实现类或子类,找不到或是找到多个,都会抛出异常。

是spring提供的注解,有一个属性required,表示注入时如果bean不存在是否允许。

(默认是true表示不允许为空,否则报错。)

1、加到类的属性字段上,默认会使用反射机制来实现注入;

2、原则上要加到类的属性set方法上。

1、加到类的属性字段上,默认的name是属性名称,默认的type是属性类型

2、加到类的属性set方法上,默认的name是方法的参数名称,默认的type就是set方法的参数类型。

默认先按照byType查找类并注入,再按照byName查找类并注入。

byName的原则,查找beanId等于指定的名称的bean,找不到则抛出异常。

byType的原则,查找指定的类、实现类或子类,找不到或是找到多个,都会抛出异常。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6761052.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-27
下一篇 2023-03-27

发表评论

登录后才能评论

评论列表(0条)

保存