spring多次加载bean

时间:2016-04-17 14:05:43

标签: java spring spring-mvc spring-security

我有一个弹簧应用程序,现在已经走了很长一段路。我最近实现了ServerSocket,这就是事情开始起作用的地方。我的ServerSocket加载正常,我可以很容易地连接到它,但由于某种原因,构造函数被多次调用(这会导致端口问题)。该类在“WebAppConfig extends WebMvcConfigurerAdapter”类中创建为bean,该类是调用构造函数的位置。我做了一些测试,发现WebMvcConfigurerAdapter加载了两次或更多次(通过向其构造函数添加println)。为什么会发生这种情况是我的问题。

我在项目中使用了xml和注释的组合。我想转到仅基于注释的spring,但是当我尝试这个时,我无法控制会话超时。因此,我坚持这种组合,从来没有想过更多。这种组合可以导致多次加载WebMvcConfigurerAdapter吗?

这是我的xml配置: 的web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
     version="3.1">
    <session-config>
        <session-timeout>
            60
        </session-timeout>
    </session-config>
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>
            org.springframework.web.servlet.DispatcherServlet
        </servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

弹簧servlet.xml中

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
   http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">

<context:component-scan base-package="com"/>


</beans>

我的WebAppConfig类如下所示:

@Configuration
@ComponentScan("com")
@EnableWebMvc
public class WebAppConfig extends WebMvcConfigurerAdapter {
    private static int startups = 0;

    public WebAppConfig(){
        System.out.println(++startups);
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("resources/**").addResourceLocations("resources/"); //.setCachePeriod(31556926);
    }

    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/view/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    //This is the ServerSocket Bean.
    @Bean
    public PlayerConnections playerConnections(){
        return new PlayerConnections();
    }
}

我编写WebAppConfig的唯一地方是在SecurityConfig类中,我在公共类定义之前使用注释“@Import({WebAppConfig.class})”。

几乎解决了 当我写这个问题时,我只需要尝试从securityConfig类中删除@Import注释。这解决了上面的问题! WebAppConfig类现在只加载一次!

我说几乎已经解决了,因为我仍然不知道这将如何改变我的应用程序。是否需要进口加入? SecurityConfig类中的所有安全配置仍然有效...... 这是SecurityConfig类:

@Configuration
@EnableWebSecurity
//@Import({WebAppConfig.class})
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("stackoverflow").password("stackoverflow").roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .....
    }
}

0 个答案:

没有答案