前情回顾
Spring拓展接口之BeanPostProcessor,我们来看看它的底层实现中讲到了spring对BeanPostProcessor的底层支持,并且知道了BeanPostProcessor的两个方法:postProcessBeforeInitialization、postProcessAfterInitialization的执行时机,没看的小伙伴可以回过头去看看。本来spring的自动装配是打算放到上一篇博文中详细讲解的,可后来觉得篇幅可能太大了,既然你们都感觉出来了,那我也就明人不说暗话了,之所以没放到上篇讲解,确实是因为篇幅太大了。好了,我们言归正传,之所以没放到上篇来讲,篇幅只是原因之
一,最主要的原因是发现我犯错了! 犯什么错了呢?
我想当然了! 理所当然的认为自动装配是在AutowiredAnnotationBeanPostProcessor的postProcessBeforeInitialization或postProcessAfterInitialization中实现的,我们来看下AutowiredAnnotationBeanPostProcessor类继承图
它间接实现了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(); } }
运行结果
我们在AnimalConfig中只是将Dog、Cat、Pig的实例注册到了spring容器&