初始化组件的使用

时间:2022-03-10 21:39:39

对于web项目中的某些资源。动态但是又不常变动,而且往往总是要使用到。比如说博客网站中博主的个人简介、条件分类类别等等等等。

这些资源,不使用ajax的情况下,每一次跳转每一次都要在系统中重新加载一次。浪费了很多系统资源,造成负载多、缓存慢的情况。

此时我们可以在系统初始化的时候将这些信息放入application域中。

我们使用初始化组件 InitComponent


@Component
public class InitComponent implements ServletContextListener,ApplicationContextAware{
	//Spring Ioc 容器上下文
	private	static  ApplicationContext applicationContext; 
		
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		this.applicationContext=applicationContext;
	}

	public void contextInitialized(ServletContextEvent sce) {
		//Servlet容器初始化上下文ServletContext  即application范围
		ServletContext application=sce.getServletContext();
		//通过Spring Ioc 容器上下文对象获取bean
		BloggerService bloggerService=(BloggerService) applicationContext.getBean("bloggerService");
		Blogger blogger=bloggerService.find();
		blogger.setPassword(null);
		application.setAttribute("blogger", blogger);
		
		LinkService linkService=(LinkService) applicationContext.getBean("linkService");
		List<Link> linkList=linkService.find(null); // 查询所有的友情链接信息
		application.setAttribute("linkList", linkList);
		
		BlogTypeService blogTypeService=(BlogTypeService) applicationContext.getBean("blogTypeService");
		List<BlogType> blogTypeList=blogTypeService.countList();
		application.setAttribute("blogTypeList", blogTypeList);
		
		BlogService blogService=(BlogService) applicationContext.getBean("blogService");
		List<Blog> blogList=blogService.countList();
		application.setAttribute("blogList", blogList);
	}

	public void contextDestroyed(ServletContextEvent sce) {
	}

}

我们定义 InitComponent 类来实现  ServletContextListener  与   ApplicationContextAware  两个接口  分别获取 web 应用的application作用域,与Spring Ioc容器的上下文对象 applicationContext。

ServletContextListener 上下文监听器:用于监听web应用的启动和销毁的事件,要实现ServletContextListener接口

在Web应用中,Spring容器通常采用声明式方式配置产生:开发者只要在web.xml中配置一个Listener,该Listener将会负责初始化Spring容器,MVC框架可以直接调用Spring容器中的Bean,无需访问Spring容器本身。在这种情况下,容器中的Bean处于容器管理下,无需主动访问容器,只需接受容器的依赖注入即可。

但在某些特殊的情况下,Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器实现该功能。为了让Bean获取它所在的Spring容器,可以让该Bean实现ApplicationContextAware接口。

下面示例为实现ApplicationContextAware的工具类,可以通过其它类引用它以操作spring容器及其中的Bean实例。


<listener>
    <listener-class>com.yefan.service.impl.InitComponent</listener-class>
</listener>
我们还需在web.xml中配置如上监听器,使Springmvc容器启动时运行我们的初始化组件。