源码如下:
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("service");
context.refresh();
for (String s : context.getBeanDefinitionNames()) {
System.out.println(s);
}
UserService userService = (UserService) context.getBean("userService");
userService.printUser();
}
@Service
public class UserService {
@Autowired
private AuthService authService;
public void printUser(){
System.out.println("user:1");
}
}
@Service
public class AuthService {
public void login(){
System.out.println("login");
}
}
分析@Autowired:
点击注解查看注解源码:
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
点击Autowired
类可以看到:AutowiredAnnotationBeanPostProcessor
进入自动注入的初始化元数据方法postProcessMergedBeanDefinition()
,
@Override
public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
if (beanType != null) {
搜索每个Bean内@Autowired注解的信息
InjectionMetadata metadata = findAutowiringMetadata(beanName, beanType, null);
metadata.checkConfigMembers(beanDefinition);
}
}
注入操作,在bean的实例化之后,调用postProcessPropertyValues()方法
public PropertyValues postProcessPropertyValues(
PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeanCreationException {
InjectionMetadata metadata = findAutowiringMetadata(beanName, bean.getClass(), pvs);
try {
metadata.inject(bean, beanName, pvs);
}
catch (BeanCreationException ex) {
throw ex;
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "Injection of autowired dependencies failed", ex);
}
return pvs;
}