gpt4 book ai didi

java - Spring 和 Servlet 3.0 Java 配置困惑

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:10 25 4
gpt4 key购买 nike

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

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

这是一些代码:

网络配置

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

持久化配置

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

服务配置

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

安全配置

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

安全初始化

@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 上下文。它由所有 Controller 测试扩展;
DaoTest - 扩展 TestContext 并添加事务管理。它由所有 DAO 测试扩展;

测试环境

@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 中不存在具有配置类的重复 bean。

核心配置

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

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

关于 Java 配置的实践中对您有用的任何其他技巧也非常感谢!

最佳答案

  • WebConfig 负责与 servlet 相关的 bean,因此加载到 servlet 上下文中。可能与同一应用程序中的其他 servlet 共享的其他 bean 可以进入根上下文。 What is the difference between ApplicationContext and WebApplicationContext in Spring MVC? 是我了解上下文之间差异的良好开端。
    • 实际上这并不重要。更改顺序对我的应用程序没有任何影响。不过,我找不到任何地方记录的任何理论证据
    • 看看 http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/context/ContextHierarchy.html其中包含有关如何“合并”父子之间的上下文配置的代码示例
    • 这并不重要,因为 spring 首先加载所有 bean 定义,然后才通过执行依赖注入(inject)来实例化它们,其中 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

关于java - Spring 和 Servlet 3.0 Java 配置困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25204498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com