ApplicationContext 为什么是空的?

	@Autowired
	public void set(ApplicationContext a) {
		ctx = a;
		System.out.println("a111111111----------" + ctx);
	}

	public static  ApplicationContext getApplicationContext() {
		System.out.println("ctx222222----------" + ctx);//为什么是空的?
		return ctx;
	}

public class MyListener implements ServletContextListener{


	@Override
	public void contextInitialized(ServletContextEvent sce) {
		// TODO Auto-generated method stub
		ApplicationContext ctx=SpringContext.getApplicationContext();
//		
		
		System.out.println(ctx);//也是空的。
               }
}

因为 ServletContextListener 初始化的时候,spring还没初始化,set 方法还未执行。

1 个赞

我也发现了,set的时候有值,打印的时候,是先打印get里面的,set 的值在下面。
怎么解决呢

没法解决,因为这个监听器就是会比spring先初始化。你不如直接说你要干啥,要实现什么?也许可以考虑使用spring的监听器。

1 个赞

学习中,想法是在网站运行的时候,提前按权限把网站模块信息加载出来。
用ContextRefreshedEvent,又不能把结果传到全局变量里。

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// TODO Auto-generated method stub
SpringContext.setContext(event.getApplicationContext());
GroupDao groupDao = SpringContext.getBean(GroupDao.class);
//

	System.out.println(groupDao);
	List<Group> list = groupDao.findByGroupStatus(true);
	for (Group g : list) {
		System.out.println(g.getGroupName());
	}
	//event.getServletContext().setAttribute("GROUP_LIST", list);
}

用这个没有问题,但怎么放到全局变量里? 。。event 怎么放到Attribute里?

applicationContext也是可以注入的。

弄了好长时间了,没弄明白。。。

你在监听器里面。用@Autowired 注入进ApplicationContex就是了。

你要是不会,我明天给你代码。这会儿我睡了得。:dog:命要紧。:joy:

好的 先谢谢了

可以在Spring监听器里,注入 ServletContext ,在事件方法里完成初始化。

import javax.servlet.ServletContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.stereotype.Component;

@Component
public class ApplicationContextListener implements ApplicationListener<ContextRefreshedEvent>{

	@Autowired
	private ServletContext servletContext;
	
	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
		ApplicationContext applicationContext = event.getApplicationContext();
		if (applicationContext.getParent() != null) {
			// 初始化数据到 servletContext
			servletContext.setAttribute("name", "value");
		}
	}
}
1 个赞

我试试。

解决了,试试!!