骚话@Autowired的底层工作原理,spring的自动装配

本文探讨了Spring的@Autowired自动装配的底层工作原理,通过一个简单的示例展示了如何使用@Autowired。在源码解析部分,分析了AutowiredAnnotationBeanPostProcessor的实例化、注册过程以及bean的依赖注入步骤,解释了如何找到并缓存被注解的字段和方法。最后,文章总结了bean创建与初始化的过程,以及Spring支持的几种自动装配注解。
摘要由CSDN通过智能技术生成

 

前情回顾

Spring拓展接口之BeanPostProcessor,我们来看看它的底层实现中讲到了spring对BeanPostProcessor的底层支持,并且知道了BeanPostProcessor的两个方法:postProcessBeforeInitialization、postProcessAfterInitialization的执行时机,没看的小伙伴可以回过头去看看。本来spring的自动装配是打算放到上一篇博文中详细讲解的,可后来觉得篇幅可能太大了,既然你们都感觉出来了,那我也就明人不说暗话了,之所以没放到上篇讲解,确实是因为篇幅太大了。好了,我们言归正传,之所以没放到上篇来讲,篇幅只是原因之

一,最主要的原因是发现我犯错了! 犯什么错了呢?

我想当然了! 理所当然的认为自动装配是在AutowiredAnnotationBeanPostProcessor的postProcessBeforeInitialization或postProcessAfterInitialization中实现的,我们来看下AutowiredAnnotationBeanPostProcessor类继承图

骚话@Autowired的底层工作原理,spring的自动装配

 

它间接实现了BeanPostProcessor,我们再去看下那两个方法(在父类InstantiationAwareBeanPostProcessorAdapter中)

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
 return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
 return bean;
}

竟然啥也没干,只是简单的return bean; 当自己深以为然的认知被推翻时,那感觉真是毙了狗了

所以自动装配不能和BeanPostProcessor放一块讲,不得不开两篇来分开讲,我们都知道:强扭的瓜不甜!

自动装配简单示例

我们先来看一个简单的自动装配的示例,完整实例代码:spring-boot-BeanPostProcessor

AnimalServiceImpl

@Service
public class AnimalServiceImpl implements IAnimalService {
 @Autowired
 private Dog dog;
 @Resource
 private Cat cat;
 @Inject
 private Pig pig;
 @Override
 public void printName() {
 System.out.println(dog.getName());
 System.out.println(cat.getName());
 System.out.println(pig.getName());
 }
}

AnimalTest

@RunWith(SpringRunner.class)
@SpringBootTest(classes={Application.class})
public class AnimalTest {
 @Autowired
 private IAnimalService animalService;
 @Test
 public void test() {
 animalService.printName();
 }
}

运行结果

骚话@Autowired的底层工作原理,spring的自动装配

 

我们在AnimalConfig中只是将Dog、Cat、Pig的实例注册到了spring容器&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值