Spring和Servlet 3.0 Java配置混乱

nyx*_*yxz 5 java configuration spring 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 */ }  
Run Code Online (Sandbox Code Playgroud)

PersistenceConfig

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

ServiceConfig

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

SecurityConfig

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter { /* Bean initialization */ }  
Run Code Online (Sandbox Code Playgroud)

SecurityInitializer

@Order(1)
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {
}
Run Code Online (Sandbox Code Playgroud)

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[] {"/"};
    }

}
Run Code Online (Sandbox Code Playgroud)

并且必须测试我拥有的所有东西:

TestContext - 我认为它构建基本上下文的抽象类;
TestWebContext- 扩展TestContext并添加WebCOnfig上下文.所有控制器测试都扩展了它;
DaoTest- 扩展TestContext和添加事务管理.所有DAO测试都扩展了它;

的TestContext

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {PersistenceConfig.class, ServiceConfig.class, SecurityConfig.class})
public abstract class TestContext {
}
Run Code Online (Sandbox Code Playgroud)

TestWebContext

@ContextConfiguration(classes = {WebConfig.class})
@WebAppConfiguration
public abstract class TestWebContext extends TestContext {
}
Run Code Online (Sandbox Code Playgroud)

DaoTest

@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public abstract class DaoTest extends TestContext {
}
Run Code Online (Sandbox Code Playgroud)

问题:

  • 我什么时候应该把WebConfig.classgetServletConfigClasses()getRootConfigClasses()或两者兼而有之?有什么不同?
  • 是否存在于getRootConfigClasses()getServletConfigClasses()方法中的类的顺序是否重要?我已经看到某个地方的订单对初始化者和人们都很重要@Order,但这些Config课程呢?
  • 对于TestWebContext类我知道只是添加@ContextConfiguration(classes = {WebConfig.class})覆盖@ContextConfiguration基类但是如何实现上下文扩展?
  • 如果我添加另一个配置类说CoreConfig(我有一个).然后从其中加载Spring应用程序上下文并将其添加到以下类中getRootConfigClasses():
    注意:applicationContext.xml中不存在具有Config类的重复bean.

CoreConfig

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

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

来自练习的任何其他技巧对您有关Java配置的帮助也非常感谢!

Mar*_*ios 2

  • WebConfig 负责与 servlet 相关的 bean,因此加载到 servlet 上下文中。可能与同一应用程序中的其他 servlet 共享的其他 bean 可以位于根上下文中。对于我来说,了解上下文之间的差异是一个很好的开始,Spring MVC 中的 ApplicationContext 和 WebApplicationContext 之间有什么区别?
    • 实际上这并不重要。更改顺序对我的应用程序没有任何影响。但我在某处找不到任何记录的理论证明
    • 查看 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextHierarchy.html,其中包含有关如何“合并”父级之间的上下文配置的代码示例-孩子们
    • 这并不重要,因为 spring 首先加载所有 bean 定义,然后才通过执行依赖注入来实例化它们,其中 bean 是其他 bean 的属性或构造函数参数首先被初始化。如果一个 bean 依赖于另一个 bean,但它们之间没有属性或构造函数依赖关系,spring 无法理解顺序,则可以使用“depends-on”属性

关于配置文件的使用,我实际上使用了与您类似的方法。您可能会发现有用的更改可能是仅从 getRootConfigClasses() 加载 RootConfig.class,并且 RootConfig 可以导入 SecurityConfig.class、PersistenceConfig.class 和 ServiceConfig.class 以及它可能具有的任何其他功能。例如,在我的例子中,它还使用 @PropertySource("classpath:application.properties") 注释加载 application.properties 文件并包含 PropertySourcesPlaceholderConfigurer bean