问题:
标题有歧义,其实我想表达的是,通过注解@Component交给spring管理的类,通过关键字new出来为什么会出现一些问题.
这些问题包括:
public MyClassA
{
//通过new关键字new MyClassA后, myClassB 会为null
@AutoWired
private MyClassB myClassB ;
}
为什么?
因为在启动spring后,spring会将所有注解过的类加载容器内,并返回给ApplicationContextAware,在其他注解后的类需要对象时,容器会自动注入,但是自己new的类不会被容器注入.
如何解决?
自己实现ApplicationContextAware,自己根据类的类型手动获得加载后的bean即可
示例代码:
@Component
public class GetBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (GetBeanUtil.applicationContext == null) {
GetBeanUtil.applicationContext = applicationContext;
}
}
/**
* 返回ApplicationContext
*
* @return ApplicationContext
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 返回bean
*
* @param beanName beanName
* @return bean
*/
public static Object getBean(String beanName) {
return applicationContext.getBean(beanName);
}
/**
* 获取bean
*
* @param c c
* @param <T> 泛型
* @return bean
*/
public static <T> T getBean(Class<T> c) {
return applicationContext.getBean(c);
}
/**
* 获取bean
* @param c c
* @param name 名称
* @param <T> 泛型
* @return T 泛型
*/
public static <T> T getBean(String name, Class<T> c) {
return getApplicationContext().getBean(name, c);
}
}
如何使用上述示例?
public class AreaInvadeAnalyzer extends Analyzer {
private AreaInvadeMapper areaInvadeMapper =GetBeanUtil.getBean(AreaInvadeMapper.class);
....其他代码省略
}
我为什么会遇到这个问题?
使用职责链模式时,handler里面有一些需要引入的类,将handler交给spring管理后发现里面通过@AutoWired注入的类为null.
参考文章:
https://blog.csdn.net/qq_28080659/article/details/99687074
https://www.cnblogs.com/bayu/articles/14084433.html
抛出问题:
1.注入类的方式有哪些?
2.获取类的方式有哪些?
3.bean的生命周期?
4.类加载过程?
5.类加载器顺序?