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

来源:互联网 发布:java 调用浏览器打印 编辑:程序博客网 时间:2024/05/16 17:09

因为需要在程序启动时加载相关系统参数,所以百度了很多,现在做个记录。

一、使用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 过滤器。  */ @Overridepublic void contextDestroyed(ServletContextEvent arg0) {System.out.println("这是Listener的结束");}/*@Autowiredprivate UserService userService;*//**  * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,  * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。  */@Overridepublic 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{@Autowiredprivate UserService userService;@Overridepublic 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和数据层的问题都解决了。有看到这篇笔记的筒子们有别的实现方法的也希望能告诉我。

0 0
原创粉丝点击