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

在SpringMVC中实现程序启动时加载数据库中内容

2016-02-14 16:12 621 查看
因为需要在程序启动时加载相关系统参数,所以百度了很多,现在做个记录。

一、使用servlet(失败)

1、继承HttpServlet类,并在构造方法中处理

public class ViewServlet extends HttpServlet {
public ViewServlet() {
System.out.println("这是一个测试构造函数Servlet");
}
}


2、在web.xml中配置servlet的启动顺序

<servlet>
<servlet-name>viewServlet</servlet-name>
<servlet-class>com.util.classUtil.ViewServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>


这里的<load-on-startup>2</load-on-startup>就是启动顺序

a、当值为0或者大于0时,表示容器在应用启动时就加载这个servlet

b、当是一个负数时或者没有指定时,则指示容器在该servlet被选择时才加载

c、正数的值越小,启动该servlet的优先级越高

(在这里我不把其设置为1是应为我想要spring的DispatcherServlet先执行)

这个方法的弊端在于我没法获取application,我使用

ServletContext application = this.getServletContext();// 获取application
得到的是null(如果有获取的方法,知道的大牛记得高诉我)

二、实现ServletContextListener接口(失败)

1、实现ServletContextListener接口,并在contextInitialized方法中处理

public class ViewListener implements ServletContextListener {
/**
* 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
*/
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("这是Listener的结束");

}
/*	@Autowired
private UserService userService;*/
/**
* 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
* 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("这是Listener的开始");
/*
try {
TBLBaseUser user= dao.findByName("张三");
System.out.println("name:"+user.getUserName()+"\t psw:"+user.getPassword());
} catch (Exception e) {
e.printStackTrace();
}*/
ServletContext application = sce.getServletContext();
application.setAttribute("test", "this is test!");

}

}
2、在web.cml中配置listener

<listener>
<listener-class>com.util.classUtil.ViewListener</listener-class>
</listener>


这时候application的问题解决,但是新的问题出现了。我无法使用spring的数据层了。

将上面的/***/中注释的代码弄出来,调断点的时候发现userService根本就没有被初始化。

毕竟listener没法像servlet那样设定执行顺序,在该listener执行的时候spring的配置还没执行完呢

三、继承ServletContextAware类(成功)

1、继承spring自带的ServletContextAware类,并在setServletContext方法中处理

public class SpringViewListener implements ServletContextAware{
@Autowired
private UserService userService;
@Override
public void setServletContext(ServletContext sc) {
TBLBaseUser user=null;
try {
user = userService.findByName("张三");
System.out.println("name:"+user.getUserName()+"\t psw:"+user.getPassword());
} catch (Exception e) {
}
sc.setAttribute("userName", user.getUserName());

}


2、在applicationContext.xml中配置bean

<bean class="com.util.classUtil.SpringViewListener"/>


此时application照样没问题,但是加上数据库那部分就报错了,具体错误我就不贴了,大致意思就是Autowired在这里用不了。

毕竟Autowired是应该在service或者Controller中才能使用的,所以这里我们应该吧bean按照service或者Controller的方式来配。

我这里调用的是service中的方法,那么这个bean就应该配成Controller

我之前都是按注解配的,这里也这样就可以了:

1、把之前在在applicationContext.xml中配置的删除

<bean class="com.util.classUtil.SpringViewListener"/>
2、在SpringViewListener上加上@Controller

好了,到这里application和数据层的问题都解决了。有看到这篇笔记的筒子们有别的实现方法的也希望能告诉我。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: