@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 {
@Autowired
@Qualifier("userDao") //进行在相同bean下提升最高优先级
private UserDao userDao;
}

@Resource

public class TestServiceImpl {
@Resource(name="userDao")
private UserDao userDao; // 用于字段上
}

@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里面的中的,所以可以理解为 @Component细分为@Reposity,@Service,@Controller