1、在自定义appender时,注入组件发现为null
public class WeChatAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
@Resource
xxxService xxxservice; // 代码运行时为null
}
后来加入了一个构造方法,打了断点,发现他并不是在容器初始化之后进行类的初始化的,所以他自然注入组件就找不到了。其实自己想一想,既然是日志处理器,那么它必然是需要在spring启动的时候就开始工作,因为它要在控制台阿啥的打日志什么的。所以它的初始化是必然早于容器的。
2、解决方案
自己建一个ApplicationContextUtil工具类,自己去获取bean。
@Component
public class ApplicationContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
ApplicationContextUtil.applicationContext = applicationContext;
}
public static <T> T getBean(String name) {
return (T) applicationContext.getBean(name);
}
}```
调用getBean就可以获得所需要的bean了。具体spring容器的初始化没有去深究,只是简单的了解了下。