春天& Servlet 3.0 Java配置混乱

时间:2014-08-08 13:20:26

标签: java spring configuration servlet-3.0

上下文
我从基于XML的Spring配置切换到了基于Java的配置。我的应用程序有一个基于JSP的Web层,Spring MVC,Spring Security和Hibernate作为持久性提供程序 我设法在不同的配置类中分离整个XML配置:
WebConfig - 用于Spring MVC配置;
PersistenceConfig - 正如名称所述 - 用于JPA配置;
ServiceConfig - 仅适用于@Service和@Component注释类;
SecurityConfig - 用于Spring安全配置。

对于应用程序初始化,我有SecurityInitializerWebAppInitializer类。

以下是一些代码:

WebConfig

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.demo.app.web"})
public class WebConfig extends WebMvcConfigurerAdapter { /* Bean initialization */ }  

PersistenceConfig

@Configuration
@ComponentScan(basePackages = {"com.demo.app.dao"})
@EnableTransactionManagement(mode = AdviceMode.PROXY, proxyTargetClass = true)
public class PersistenceConfig { /* Bean initialization */ }  

ServiceConfig

@Configuration
@ComponentScan(basePackages = {"com.demo.app.service", "com.demo.app.component"})
public class ServiceConfig { /* Bean initialization */ }  

SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter { /* Bean initialization */ }  

SecurityInitializer

@Order(1)
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {
}

WebAppInitializer

@Order(2)
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] {SecurityConfig.class, PersistenceConfig.class,
                ServiceConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] {WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] {"/"};
    }

}

必须测试我所拥有的全部内容:

TestContext - 我认为它设定基本背景的抽象类;
TestWebContext - 扩展TestContext并添加WebCOnfig上下文。它通过所有控制器测试得到扩展;
DaoTest - 扩展TestContext并添加事务管理。所有DAO测试都扩展了它;

的TestContext

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PersistenceConfig.class, ServiceConfig.class, SecurityConfig.class})
public abstract class TestContext {
}

TestWebContext

@ContextConfiguration(classes = {WebConfig.class})
@WebAppConfiguration
public abstract class TestWebContext extends TestContext {
}

DaoTest

@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public abstract class DaoTest extends TestContext {
}

问题:

  • 我应该何时将WebConfig.class放入getServletConfigClasses()getRootConfigClasses()或两者中?有什么区别?
  • getRootConfigClasses()getServletConfigClasses()方法中存在的类的顺序是否重要?我已经看到某个地方的顺序对初始化程序很重要,人们会将@Order放在他们身上,但Config类怎么样?
  • 对于TestWebContext类,我知道只是添加@ContextConfiguration(classes = {WebConfig.class})会覆盖基类中的@ContextConfiguration但是如何实现上下文扩展?
  • 如果我添加另一个配置类说CoreConfig(我有一个)。然后从XML中加载spring应用程序上下文并将其添加到getRootConfigClasses()中的类:
    注意:applicationContext.xml中不存在具有Config类的重复bean。

CoreConfig

@Configuration
@EnableScheduling
@ImportResource("classpath:applicationContext.xml")
public class CoreConfig { // No duplicate Beans load }  

首先加载哪些bean? applicationContext.xml中的那些或Config类中的那些?

对于Java配置的任何其他技巧提示也非常感谢!

1 个答案:

答案 0 :(得分:2)

关于配置文件的使用,我实际上使用了与您类似的方法。您可能觉得有用的更改可能是只从getRootConfigClasses()加载RootConfig.class,并且RootConfig可以导入SecurityConfig.class,PersistenceConfig.class和ServiceConfig.class以及它可能具有的任何其他功能。例如,在我的情况下,它还使用@PropertySource(&#34; classpath:application.properties&#34;)注释加载一个application.properties文件,并包含一个PropertySourcesPlaceholderConfigurer bean