1.注解注入
@Autowired 使用注解注入
存在的问题:有时候注解获取为null【springBoot的初始化类加载顺序】
2.自己获取
(1)implements ApplicationContextAware接口,并实现setApplicationContext方法
public class SpringContext implements ApplicationContextAware{
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public void setApplicationContext(ApplicationContext applicationContext){
this.applicationContext = applicationContext;
}
public static Object getBean(String beanName) {}
public static <T> T getBean(Class<T> cls) {}
}
(2)获取bean
SpringContext.getBean(T.class);
(3)原理简析
springBoot初始化加载bean过程中【springBoot启动过程】,会调用setApplicationContext方法初始化SpringContext(因为implements了ApplicationContextAware,springboot启动过程调用invokeAwareInterfaces),得到beanFactory是一个DefaultListableBeanFactory类型的对象,有拿到bean的具体实现方法【beanFactory的类继承关系】。
(class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable )
class: class ApplicationContextAwareProcessor implements BeanPostProcessor
private void invokeAwareInterfaces(Object bean) {
if (bean instanceof Aware) {
if (bean instanceof EnvironmentAware) {
((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
}
if (bean instanceof EmbeddedValueResolverAware) {
((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
}
if (bean instanceof ResourceLoaderAware) {
((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
}
if (bean instanceof ApplicationEventPublisherAware) {
((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
}
if (bean instanceof MessageSourceAware) {
((MessageSourceAware) bean).setMessageSource(this.applicationContext);
}
if (bean instanceof ApplicationContextAware) {
((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
}
}
}
相关资料推荐:https://my.oschina.net/qiangzigege/blog/905985?utm_medium=referral