Spring mvc 在SpringMVC中启用事务
我的应用程序运行得很好,但我不确定为什么我需要这样配置。 问题是必须在根和调度程序这两种上下文中启用事务 为什么必须这样做? 应用程序的配置如下:Spring mvc 在SpringMVC中启用事务,spring-mvc,transactions,spring-transactions,Spring Mvc,Transactions,Spring Transactions,我的应用程序运行得很好,但我不确定为什么我需要这样配置。 问题是必须在根和调度程序这两种上下文中启用事务 为什么必须这样做? 应用程序的配置如下: public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses () { retur
public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses () {
return new Class<?>[] {RootConfig.class};
}
@Override
protected Class<?>[] getServletConfigClasses () {
return new Class<?>[] {WebMvcConfig.class};
}
}
最后
@Configuration
@ComponentScan(basePackages = {"com.web"})
@EnableWebMvc
@EnableTransactionManagement
public class WebMvcConfig extends WebMvcConfigurerAdapter {
// Beans Config ...
}
注意:
- 事务只是在服务层中进行管理
- 两个配置中都存在
上课@EnableTransactionManagement
WebMvcConfig
中的一个,那么当从Controller
类访问时,事务将不会注入服务层。即使服务层由根上下文扫描
如果我删除了RootConfig
中的一个,事务将不会被注入服务层,例如由Spring Security进行访问时
有什么方法可以全局启用事务吗?您不应该只在根上下文中的一个上同时启用事务。您可能需要扫描两次相同的组件,最后两次实例化应用程序的一部分(服务,DAO)。由root(
ContextLoaderListener
)和servlet(DispatcherServlet
)执行一次。从你描述的症状来看。我完全同意,但仍然找不到原因。因为你有一个@CompontScan
,在这两种情况下都扫描相同的组件,可能会选择一个额外的配置类或类似的东西。但是您正在创建同一组件的实例两次。您不应该只在根上下文中的一个组件上同时创建它们。您可能需要扫描两次相同的组件,最后两次实例化应用程序的一部分(服务,DAO)。由root(ContextLoaderListener
)和servlet(DispatcherServlet
)执行一次。从你描述的症状来看。我完全同意,但仍然找不到原因。因为你有一个@CompontScan
,在这两种情况下都扫描相同的组件,可能会选择一个额外的配置类或类似的东西。但是您正在创建同一组件的实例两次。您不应该只在根上下文中的一个组件上同时创建它们。您可能需要扫描两次相同的组件,最后两次实例化应用程序的一部分(服务,DAO)。由root(ContextLoaderListener
)和servlet(DispatcherServlet
)执行一次。从你描述的症状来看。我完全同意,但仍然找不到原因。因为你有一个@CompontScan
,在这两种情况下都扫描相同的组件,可能会选择一个额外的配置类或类似的东西。但您要创建同一组件的实例两次。
@Configuration
@ComponentScan(basePackages = {"com.web"})
@EnableWebMvc
@EnableTransactionManagement
public class WebMvcConfig extends WebMvcConfigurerAdapter {
// Beans Config ...
}