annotation
@Autowired 注解
AutowiredAnnotationBeanPostProcessor在处理依赖注入时,从bean工厂中去获取,首先是根据字段的类型去找符合条件的bean,若得到的bean有多个,则找出有@Primary注解修饰的bean,若都没有,则退化成@Resource注解的功能,即根据字段名去寻找bean,若都没有,则会抛出找到多个bean的异常。可以定位到org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.AutowiredFieldElement#inject方法细看注入逻辑。
总结:@Autowired注解 是现根据 byType自动注入寻找符合的bean,如果没有就使用byName去寻找对象,与@resource的注解功能一样,如果没找到 则抛出异常(?)
@Autowired是先按照类型去挑选候选的bean,然后根据qualifier在这些候选的bean中去挑选要注入的bean。
@Resource注解
根据byName 根据字段名进行查找注解,但 需要class后跟类型匹配才可以进行注入,
即:
- 只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
- 既指定了@Resource的name属性又指定了type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
所以如果使用name属性,则使用byName的自动注入策略, 而使用type属性时,则使用byType自动注入策略。如果name和type两个属性都不指定,这时将通过反射机制使用byName自动注入策略。 默认按照byName进行装配,当xml文件中存在相同类型的bean会根据byType进行装配。
@Resource是先按照名称去挑选要注入bean,如果找不到则退化成按照类型去注入。
@Resource与@Autowired 相等交换
@Autowired
public class TestServiceImpl { |
@Resource
public class TestServiceImpl { |
@Reference 注解
@Reference是dubbo注解,它注入的是分布式的远程服务对象,需要dubbo配置使用。在微服务中,工程项目会分成很多模块(Maven工程),每个模块相当于一个服务,一个服务调用另一个服务的功能需要使用@Reference注解。
dubbo内调用@Service 进行远程dubbo注册
//@Service将这个类提供的方法(服务)对外发布。将访问的地址 ip,端口,路径注册到注册中心中
@Reference(url = "dubbo://127.0.0.1:2181",validation = "true",timeout = 50000) |
进行dubbo客户端地址指定
spring 中常见注解如下
声明bean注解类型
@Component
当指定bean类型不为@Controller,@Services时候可以使用@Component来进行标注,可以把普通的pojo类型实列化到spring容器中,相当于xml里面的中的