Spring中,给静态变量初始化的问题

来源:互联网 发布:图片软件排行 编辑:程序博客网 时间:2024/06/06 20:28
方案一:使用@PostConstruct注解首先,声明一个静态变量staticTarget,静态变量staticTarget的类型要和非静态变量target的类型一致。然后,在带有@PostConstruct注解的方法中,将target的值赋给staticTarget。最后,在静态方法中通过调用静态变量staticTarget来实现对非静态变量target的调用。说明:1)在指定方法上加上@PostConstruct 注解来指定该方法是在bean初始化之后调用2)在指定方法上加上@PreDestroy 注解来指定该方法是在bean销毁之前调用方案二:使用@PostConstruct注解首先,声明一个静态变量factory,这个静态变量factory的类型为该类自身。然后,在带有@PostConstruct注解的方法中,将this赋给这个静态变量factory,此时,factory指向了一个该类的实例(在容器启动的时候创建),故factory可以访问到该实例中的字段。最后,在静态方法中,通过调用静态变量factory来访问该类中的非静态变量。例子:@Componentpublic class FailureTool {/*// 方案一:@Autowiredprivate MailUtil target1;@Autowiredprivate ThreadPoolTaskExecutor target2;private static MailUtil staticTarget1;private static ThreadPoolTaskExecutor staticTarget2;@PostConstruct public void init(){staticTarget1 = target1;staticTarget2 = target2;}*/// 方案二:@Autowiredprivate MailUtil mailUtil;@Autowiredprivate ThreadPoolTaskExecutor taskExecutor;private static FailureTool factory; @PostConstruct public void init(){factory = this;}public static void sendMail(AccountQuotaMonitor accountQuotaMonitor) {/*// 方案一SendMailTask sendMailTask = new SendMailTask(staticTarget1, accountQuotaMonitor);FutureTask<Integer> futureTask = new FutureTask<Integer>(sendMailTask);staticTarget2.submit(futureTask);*/// 方案二SendMailTask sendMailTask = new SendMailTask(factory.mailUtil, accountQuotaMonitor);FutureTask<Integer> futureTask = new FutureTask<Integer>(sendMailTask);factory.taskExecutor.submit(futureTask);}方案三:通过实现ApplicationContextAware接口来获取到spring的ApplicationContext,进而可以获取到容器中的任何对象。说明:1)实现了ApplicationContextAware接口的类,在实例化时会自动调用setApplicationContext方法,2)在setApplicationContext方法中,将类型为ApplicationContext的入参的值赋值给该类的一个静态变量,3)然后就可以通过调用静态的getApplicationContext方法来获取到该类的静态变量,也即获取到了ApplicationContext。例子:@Componentpublic class ApplicationContextUtil implements ApplicationContextAware {private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {// TODO Auto-generated method stubApplicationContextUtil.context = applicationContext;}public static ApplicationContext getApplicationContext() {return context;}}

0 0
原创粉丝点击