赞
踩
问题来源:工具类一般都是静态方法,静态方法只能调用静态成员,然而通过@Autowired注入的Bean不是静态成员,如何解决?
解决方案:利用@PostConstruct注解,代码示例如下:
- //定义static类型的变量
- private static ApplicationEventPublisher thisApplicationEventPublisher;
- @Autowired
- private ApplicationEventPublisher applicationEventPublisher;
-
- @PostConstruct //通过该注解,将注入bean值set到工具类的变量中
- public void init() {//bean注入后执行一次,防止线程不安全,加锁。
- synchronized (TriggerEventHandler.class) {
- thisApplicationEventPublisher = applicationEventPublisher;
- }
- }
PostConstruct注释规则
1. 除了拦截器这个特殊情况以外,其他情况都不允许有参数,否则spring框架会报IllegalStateException;而且返回值要是void,但实际也可以有返回值,至少不会报错,只会忽略
2. 方法的权限使用public、protected、private都可以,功能是由反射来实现
3. 方法不可以是static的,但可以是final的
所以,综上所述,在spring项目中,在一个bean的初始化过程中,方法执行先后顺序为
Constructor > @Autowired > @PostConstruct
先执行完构造方法,再注入依赖,最后执行初始化操作,所以这个注解就避免了一些需要在构造方法里使用依赖组件的尴尬。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。