Spring 尽管有@Component和@bean,但未找到类的bean

Spring 尽管有@Component和@bean,但未找到类的bean,spring,grizzly,Spring,Grizzly,我有一个在java端创建套接字的类。问题是它抛出了一个java.lang.IllegalArgumentException:找不到com.production.workflow.process.approval.ApprovalSocketHandler类的bean package com.production; @WebListener public class SocketInitializer implements ServletContextListener { public

我有一个在java端创建套接字的类。问题是它抛出了一个
java.lang.IllegalArgumentException:找不到com.production.workflow.process.approval.ApprovalSocketHandler类的bean

package com.production;

@WebListener
public class SocketInitializer implements ServletContextListener {

    public static App app;

    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        AutowireCapableBeanFactory beanFactory = ApplicationContextProvider.getApplicationContext().getAutowireCapableBeanFactory();
        app =  new App(new Options().url("/socket/workstation/approval").packageOf(this), new AtmosphereModule(servletContextEvent.getServletContext()), new SpringModule(beanFactory));
        app.bean(ApprovalSocketHandler.class).init();
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {

    }
}
这个类所在的包确实正在通过我的配置进行扫描。我怀疑在初始化此侦听器时,配置尚未扫描

@Configuration
@ComponentScan(basePackages = {
        "com.production"
})
@PropertySource(value= {
        "classpath:/application.properties",
        "classpath:/environment-${MY_ENVIRONMENT}.properties"
})
@EnableJpaRepositories("com.production.repository")
@EnableTransactionManagement
public class Config {
    @Value("${db.url}")
    String PROPERTY_DATABASE_URL;
    @Value("${db.user}")
    String PROPERTY_DATABASE_USER;
    @Value("${db.password}")
    String PROPERTY_DATABASE_PASSWORD;

    @Value("${persistenceUnit.default}")
    String PROPERTY_DEFAULT_PERSISTENCE_UNIT;

    @Value("${hibernate.dialect}")
    String PROPERTY_HIBERNATE_DIALECT;
    @Value("${hibernate.format_sql}")
    String PROPERTY_HIBERNATE_FORMAT_SQL;
    @Value("${hibernate.show_sql}")
    String PROPERTY_HIBERNATE_SHOW_SQL;
    @Value("${entitymanager.packages.to.scan}")
    String PROPERTY_ENTITYMANAGER_PACKAGES_TO_SCAN;

    @Bean
    public App app() {
        return SocketInitializer.app;
    }
在ServletContextListener执行期间,为了确保该类是一个bean,我需要做些什么?

该接口就是您想要的。它提供了方法

setServletContext(ServletContext servletContext) 
哪个Spring将用于注入应用程序上下文。在您的例子中,这将是由servlet容器创建的
ServletContext


您不应该像在您的问题中那样将其用于
ServletContextListener
,因为
ServletContextListener
是由servlet容器而不是Spring初始化的。因此,Spring无法发挥其神奇作用。

ServletContextListener
s由servlet容器加载和注册。@SotiriosDelimanolis-在这种情况下,这有什么意义?servlet容器在Spring之前处理事情,因此bean在
contextInitialized
中不可用。“不过我没有一个解决办法给你。”索蒂里奥斯德里曼诺利斯-嗯。。。如果您碰巧知道如何将
ServletContext
注入我的配置类,那么您将以另一种方式解决我的问题。请查看
ServletContextAware
接口。