Java 在上下文初始化期间使用服务

Java 在上下文初始化期间使用服务,java,spring,servlets,autowired,servletcontextlistener,Java,Spring,Servlets,Autowired,Servletcontextlistener,我想在我的web应用程序中初始化一些代码。之前,我在我的一个豆子中使用它作为@PostConstruct,但我觉得它不太合适。 在我看来,在生命周期中初始化代码的位置是在servletcontext初始化之后 这就是为什么我写了这样一个listener类: public class MyServletContextListener implements ServletContextListener { @Autowired UserService userService;

我想在我的web应用程序中初始化一些代码。之前,我在我的一个豆子中使用它作为@PostConstruct,但我觉得它不太合适。 在我看来,在生命周期中初始化代码的位置是在servletcontext初始化之后

这就是为什么我写了这样一个listener类:

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

现在,这不起作用,我想这是因为我不能在生命周期的早期自动连接我的服务。我无法手动构造新的修复和用户服务,因为这些类是抽象的。我应该将初始化代码移到其他地方吗?或者在生命周期的早期有什么方法可以做到这一点?

有一个名为

 ApplicationContextInitializer<ConfigurableApplicationContext>
尝试创建一个实现该接口的类,spring将知道initialize方法及其内容

将其添加到web.xml中

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

上下文初始化类
class.to.the.interface.init.RuntimeEnvironmentInitializer

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

我试着查找一下如何配置它,但是这个方法中的代码似乎没有运行。我需要在我的web.xml或其他文件中添加此侦听器吗?我应该提到我的web.xml org.springframework.web.context.ContextLoaderListener更新中有此侦听器。在我的响应中,您需要在web.xml中添加名为contextInitializerClasses的上下文参数,并指向实现接口的类。检查更新如果我这样做,服务仍然为空
  <context-param>
      <param-name>contextInitializerClasses</param-name>
      <param-value>class.to.the.interface.init.RuntimeEnvironmentInitializer</param-value>
   </context-param>