获取Spring中bean对象或在Spring初始化完成之后使用Spring中bean对象

        之前一直没有做过服务端东西,现在有个需要,在服务端启动后,后台一直轮询查询一个信息,若发现信息则提醒用户,给用户发送一个通知。

        因为以前对服务端的涉及也就是在客户端去调用服务端的Action,这样服务端是被动的去执行某个方法,现在要在服务端主动去执行,刚开始有一些懵,不断在网上查找资料,尝试,将自己的一些方法和遇到的坑记录下来。

        首先我用的方法的是,新建一个类,继承自HttpServt类,然后重写他的init()方法,在servlet类执行时,会首先去执行这个init()方法,我们只要将执行的逻辑在init()方法中调用即可:

public class MyServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Override
    public void init() throws ServletException {
        // TODO Auto-generated method stub
        super.init();
        System.out.println("Servlet服务已启动,开始轮询>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");

    }

}

        要将Servlet设置为随服务启动而启动,还需要在web.xml中去配置:

<servlet>
  <servlet-name>AlarmPollingServlet</servlet-name>
  <servlet-class>action.AlarmPollingServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>


         在applicationContext.xml中去配置bean:
<bean id="myServlet" class="action.MyServlet" scope="prototype">
  <property name="queryInterface" ref="queryInterfaceImpl"></property>
</bean>

         但是这样会随之出现一个问题,因为我是在这个servlet中调用了dao层的接口中的方法,这个接口对象是在Spring容器中初始化的,由于在Servlet启动的时候,Spring容器并不一定已经初始化完毕了,所以,在调用接口方法时,接口对象会报空指针异常。


        经过查阅资料我了解到有几种解决方法:
        1、在applicationContext.xml中注入bean时,在里面加上

init-method=" value "

        这个值,其中value值为将要执行的方法,但是我在项目运行时,这种方法无效,因对服务端内容不熟悉,所以还没有查出具体原因,若大家有了解详细的可以留言或者私信我交流。


        2、另一种方法是在Servlet中去获取在Spring中注入的bean对象:

private static WebApplicationContext context;
public Object findBean(String beanName) {
  if (context == null) {
    context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
  }
  return context.getBean(beanName);
}

        这样就可以在Servlet中去获取到在Spring中注入的bean对象,通过bean对象就可以获取里面的接口对象等,已经获取到了bean对象,剩下的需要做什么就由自己决定了。

MyServlet servlet = (MyServlet) findBean("alarmPollingServlet");
queryInterface = servlet.queryInterface;
queryInterface.doQuery();

        

        经过这样,就可以在servlet中去执行dao层接口中的方法了,但是,我这里还有一个问题(哈哈,真是问题好多),因为我的项目中在Spring中注入的bean对象里面,还有引用到其他bean对象,这样会在dao层接口的实现类中继续报出空指针异常,目前还未解决,所以没有用这种方法。

        以下是我用的方法:
        自定义类继承自ApplicationListener<ContextRefreshedEvent>,重写onApplicationEvent(ContextRefreshedEvent arg0)方法:

public class InstantiationTracingBeanPostProcessor implements
        ApplicationListener<ContextRefreshedEvent> {

  private queryInterface queryInterface;

  @Override
  public void onApplicationEvent(ContextRefreshedEvent arg0) {
    // TODO Auto-generated method stub
    if (arg0.getApplicationContext().getParent() == null) {
      // 需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
      queryInterface.doQuery();
    }
  }
}
         继承这个类,当服务端启动之后,Spring容器初始化完成之后,就会回调他的onApplicationEvent(ContextRefreshedEvent arg0)这个方法,所以,我们将需要执行的逻辑代码写在这个方法里就可以了,在执行这个方法的时候,Spring容器已经初始化完毕,这样在用到Spring中注入的对象时就不会再有空指针异常。

        以上内容为我自己磕磕绊绊中查询到的,记录下来,也希望能够帮助有同样困惑的人,如果以上内容中有不合理或者错误的,或者各位大神有什么更好的解决方法,望大家留意或者私信交流,谢谢!




  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若邪〃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值