您的位置:首页 > 编程语言 > Java开发

关于spring依赖注入到普通类中为null的情况解决理解方案

2016-12-12 16:54 489 查看
最近写了一个读取日志文件并定时保存的功能,但通过spring的依赖注入一直存在注入的实体类为null 的情况,网上查了很多的方法,有说有配置文件中包扫描的问题,

有的说是注解方式(增加@Component注解)的问题,但查了相应的方法都没有解决我的问题。无意中查到一位大神的方法,但还没有弄清楚原理,在这里先记录下来,方便以后的学习并加上自己的理解,

并希望浏览过的大神会给出一些建议和原理思路:

@Component
public class InitTiming {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractListener.class);

@Resource
private KafkaTraceLogBiz kafkaTraceLogBiz;

private static InitTiming initTiming; //关键点1

public void setKafkaTraceLogBiz(KafkaTraceLogBiz kafkaTraceLogBiz) {
this.kafkaTraceLogBiz = kafkaTraceLogBiz;
}

@PostConstruct //关键点2
public void getTiming(){
SGSCallBackMethod.executeTiming(kafkaTraceLogBiz);
LOGGER.info("request error log callback timing start");
}
}


通过上面的关键点,就可以将bean成功注入到我的InitTiming类中,在这里先看看注解@PostConstruct的理解 

Java EE 5规范开始,Servlet中增加了两个影响Servlet生命周期的注解(Annotion);@PostConstruct和@PreDestroy。这两个注解被用来修饰一个非静态的void()方法 。写法有如下两种方式:

@PostConstruct

Public void someMethod() {}                                                                              

或者

public @PostConstruct void someMethod(){}

    被@PostConstruct修饰的方法会在服务器加载Servle的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。PreDestroy()方法在destroy()方法执行执行之后执行

 



 

被注解的Servlet生命周期

    需要注意的是,注解会多多少少地影响到服务器的启动速度。服务器在启动时候会遍历Web 应用的WEB-INF/classes下的所有class文件与WEB-INF/lib下的所有jar文件,以检查哪些类使用了注解。如果应用程序中没有 使用任何注解,可以在Web.xml中设置的metadata-complete属性为true.(支持@PostConstruct和 @PreDestroy的服务器需要支持Servlet2.5规范。Tomcat5.x仅支持Servlet2.4规范。)

我现在要说的是用实例说明它有什么作用。

比如说我有一种情况,在我的servlet初始化加载之前我想处理一些东西,像加载缓存等等。

怎么做。@PostConstruct就派上用场了。那为什么这玩意用的不多呢,这是因为如果初始化之前我们要加载或处理某些玩意完全可以在构造器初始化时就处理了,但这种方法需要自己重写构造器。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息