上下文
我从基于XML的Spring配置切换到了基于Java的配置。我的应用程序有一个基于JSP的Web层,Spring MVC,Spring Security和Hibernate作为持久性提供程序
我设法在不同的配置类中分离整个XML配置:
WebConfig
- 用于Spring MVC配置;
PersistenceConfig
- 正如名称所述 - 用于JPA配置;
ServiceConfig
- 仅适用于@Service和@Component注释类;
SecurityConfig
- 用于Spring安全配置。
对于应用程序初始化,我有SecurityInitializer
和WebAppInitializer
类。
以下是一些代码:
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()
中的类:CoreConfig
@Configuration
@EnableScheduling
@ImportResource("classpath:applicationContext.xml")
public class CoreConfig { // No duplicate Beans load }
首先加载哪些bean? applicationContext.xml中的那些或Config类中的那些?
对于Java配置的任何其他技巧提示也非常感谢!
答案 0 :(得分:2)
关于配置文件的使用,我实际上使用了与您类似的方法。您可能觉得有用的更改可能是只从getRootConfigClasses()加载RootConfig.class,并且RootConfig可以导入SecurityConfig.class,PersistenceConfig.class和ServiceConfig.class以及它可能具有的任何其他功能。例如,在我的情况下,它还使用@PropertySource(&#34; classpath:application.properties&#34;)注释加载一个application.properties文件,并包含一个PropertySourcesPlaceholderConfigurer bean