【问题标题】:Using a service during context initaliatizon在上下文初始化期间使用服务
【发布时间】:2014-09-13 13:24:44
【问题描述】:

我想在我的 Web 应用程序中初始化一些代码。在我将它用作我的一个 bean 中的 @PostConstruct 之前,但对我来说感觉不太合适。 在我看来,生命周期中初始化代码的地方是在 servletcontext 初始化之后。

这就是我写这样一个监听器类的原因:

public class MyServletContextListener implements ServletContextListener {

    @Autowired
    UserService userService;

    @Autowired
    RepairService repairService;

    @Override
    public void contextInitialized(ServletContextEvent sce) {       

        // Maak een gewone gebruiker
        Address address1 = new Address("Bruul", "5", "2800", "Mechelen");
        Person person1 = new Person("Jan", "Peeters", address1);
        Client client1 = new Client(person1, "jan.peeters@student.kdg.be", "jan");

        // Maak een gewone gebruiker
        Address address2 = new Address("Zandstraat", "23", "3000", "Leuven");
        Person person2 = new Person("Michel", "Van den Bergh", address2);
        Client client2 = new Client(person2, "michel.vandenbergh@gmail.com", "michel");

        // Maak een repairer
        Address address3 = new Address("Nationalestraat", "5", "2000", "Antwerpen");
        Person person3 = new Person("Wouter", "Deketelaere", address3);
        Repairer repairGuy1 = new Repairer(person3, "wouter.deketelaere@kdg.be", "jef", "Master");
        repairGuy1.rate(4);

        // Maak een repairer
        Address address4 = new Address("Kleuterstraat", "1", "2500", "Lier");
        Person person4 = new Person("Handy", "Man", address4);
        Repairer repairGuy2 = new Repairer(person4, "handy.man@handyman.com", "moeilijk", "Bachelor");
        repairGuy2.rate(3);
        // add users and update een gebruiker met een nieuw wachtwoord                
        try
        {
            userService.addUser(client1);
            userService.addUser(client2);
            userService.addUser(repairGuy1);
            userService.addUser(repairGuy2);
            userService.updatePassword(repairGuy1, "jef", "wouter");
            userService.checkLogin(repairGuy1.getUsername(), "wouter");
        }
// ommitted code

现在,这不起作用,我认为这是因为我无法在生命周期的早期自动装配我的服务。我无法手动构建新的修复和用户服务,因为这些类是抽象的。我应该将我的初始化代码移到其他地方吗?或者有没有办法在生命周期的早期做到这一点?

【问题讨论】:

    标签: java spring servlets autowired servletcontextlistener


    【解决方案1】:

    有个接口叫

     ApplicationContextInitializer<ConfigurableApplicationContext>
    

    你可以在 spring 应用程序中的应用程序上下文启动期间使用它来初始化一些东西。

    @Override
        public void initialize(final ConfigurableApplicationContext appContext) {
            this.configurableApplicationContext = appContext;
    
        }
    

    尝试创建一个实现该接口的类,spring 将知道初始化方法及其内容。

    将此添加到 web.xml

      <context-param>
          <param-name>contextInitializerClasses</param-name>
          <param-value>class.to.the.interface.init.RuntimeEnvironmentInitializer</param-value>
       </context-param>
    

    【讨论】:

    • 我已经尝试查找一下如何配置它,但似乎此方法中的代码无法运行。我需要在我的 web.xml 中添加它作为侦听器吗?
    • 我应该提一下,我的 web.xml 中确实有这个监听器 org.springframework.web.context.ContextLoaderListener跨度>
    • 在我的回复中更新,您需要在 web.xml 中添加一个名为 contextInitializerClasses 的上下文参数,并指向实现该接口的类。检查更新
    • 如果我这样做,服务仍然为空
    【解决方案2】:

    我使用 InitliazingBean 接口解决了这个问题

    【讨论】:

      猜你喜欢
      • 2013-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多