我有一个弹簧应用程序,现在已经走了很长一段路。我最近实现了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
.....
}
}