对于WebApplicationContext,我应该@Transactional
在控制器或服务中添加注解吗?Spring文档让我有些困惑。
这是我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Alpha v0.02</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
这是我的application-context.xml,它定义了一个Spring调度程序servlet:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:annotation-config />
<mvc:annotation-driven />
<tx:annotation-driven />
<context:component-scan base-package="com.visitrend" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="org.postgresql.Driver" />
<property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/postgres" />
<property name="user" value="someuser" />
<property name="password" value="somepasswd" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:test.hibernate.cfg.xml" />
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="dataSource" ref="dataSource" />
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
这是服务接口:
public interface LayerService {
public void createLayer(Integer layerListID, Layer layer);
}
这是一个服务实现:
@Service
public class LayerServiceImpl implements LayerService {
@Autowired
public LayerDAO layerDAO;
@Transactional
@Override
public void createLayer(Integer layerListID, Layer layer) {
layerDAO.createLayer(layerListID, layer);
}
}
这是我的控制器:
@Controller
public class MainController {
@Autowired
private LayerService layerService;
@RequestMapping(value = "/addLayer.json", method = RequestMethod.POST)
public @ResponseBody
LayerListSetGroup addLayer(@RequestBody JSONLayerFactory request) {
layerService.createLayer(request.getListId(), request.buildLayer());
return layerService.readLayerListSetGroup(llsgID);
}
}
Spring文档使我有些困惑。似乎表明使用WebApplicationContext意味着将仅对@Transactional注释的控制器进行调查,而不会对服务进行调查。同时,我看到大量建议,使服务具有交易性而不是控制者。我认为,<context:component-scan base-package="com..." />
在上面的spring-servlet.xml 中使用 它,使其包含服务包,这意味着服务是上下文的一部分,因此将“调查”事务性注释。这个准确吗?
这是让我感到困惑的Spring文档说明:
@EnableTransactionManagement并仅在定义它们的相同应用程序上下文中在bean上查找@Transactional。这意味着,如果将注释驱动的配置放在DispatcherServlet的WebApplicationContext中,则仅检查控制器中的@Transactional bean。你的服务。
此外,如果我将控制器方法定义为事务性的,并且在另一个类中调用事务性方法,是否会对性能产生影响或带来“问题”?根据文档,我的直觉不是,但希望对此进行验证。
不需要@Transactional
注释是应在控制器上还是在服务上进行,但通常它将在服务上执行,该服务将对一个应在一个ACID事务中逻辑执行的请求执行逻辑。
在典型的Spring MVC应用程序中,至少需要两个上下文:应用程序上下文和servlet上下文。上下文是一种配置。应用程序上下文保存与整个应用程序相关的配置,而Servlet上下文保存仅与你的servlet相关的配置。这样,servlet上下文是应用程序上下文的子级,并且可以引用应用程序上下文中的任何实体。反之则不成立。
用你的话说
@EnableTransactionManagement and only looks for @Transactional on beans in the same application context they are defined in. This means that, if you put annotation driven configuration in a WebApplicationContext for a DispatcherServlet, it only checks for @Transactional beans in your controllers, and not your services.
@EnableTransactionManagement@Transactional
在@ComponentScan
注解中声明的包中查找Bean,但仅在@Configuration
定义它们的上下文()中进行WebApplicationContext
查找。因此,如果你有一个for容器DispatcherServlet
(this is a servlet context),则将在你告诉它进行组件扫描的类中@EnableTransactionManagemen
t查找@Transactional
该上下文(@Configuration
class)。
@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "my.servlet.package")
public class ServletContextConfiguration {
// this will only find @Transactional annotations on classes in my.servlet.package package
}
由于你的@Service类是Application上下文的一部分,因此,如果你希望使它们具有事务性,则需要使用来@Configuration
为Application Context
的类添加注释@EnableTransactionManagement
。
@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = "my.package.services")
public class ApplicationContextConfiguration {
// now this will scan your my.package.services package for @Transactional
}
ContextLoaderListener
实例化DispatcherServlet
时,将你的Application Context
配置与和Servlet Context配置一起使用。(如果你尚未执行完整的基于Java的配置,请参阅javadoc,而不是xml。)
附录: @EnableTransactionManagement
具有与<tx:annotation-driven />
Java配置相同的行为。在此处检查是否ContextLoaderListener
与XML 一起使用。
我是Spring应用程序开发的新手。 如何在tomcat服务器的开发阶段运行我的应用程序。 在这里我可以看到最终部署的解决方案。每次我需要停下来重新开始时,我只需要在ui上更改一些。这让我很难受。所以你能帮我照顾她吗?? 我的pom.xml依赖是 org.springframework spring-binding 1.0.6
我正在处理在FastAPI上向远程ubuntu服务器提交的项目文件。我将尝试通过以下命令从终端运行项目(使用SSH连接) 输出是 但是我需要这个项目在服务器的IP地址上可用。如果我尝试像 我明白了 在哪里66.226.247.55-来自谷歌云平台实例的外部IP地址我如何启动一个项目,以便可以通过IP访问?
这个问题听起来可能重复,但事实是,我还没有收到解决方案。我刚刚进入struts2,正在尝试一个登录应用程序。我附上了以下图书馆: 当我单独运行正常的JSP页面(没有struts标记)时,它运行正常。但每当我单独运行带有struts标记的jsp页面时,它都会显示。在创建整个网络之后。xml和struts。xml并运行它报告的整个应用程序。我知道问题是我的jsp页面没有被识别。请帮忙。 网状物xml:
这里有一些在服务器运行 WSGI 应用的方式。当你正在开发一个应用,你往往不想在一个成 熟服务器上部署和运行,取而代之的是一个轻量服务器。 Werkzeug 就内置了这样一个轻量 的服务器。 在一个服务器上运行 start-myproject.py 最简单的方法如下示例: #!/usr/bin/env python # -*- coding: utf-8 -*- from werkzeug.se
背景资料 我有一个。NET Core 3.1控制台应用程序,这是一个长时间运行的进程。基本上,一些逻辑运行在一个无限循环中,每个循环都有一个延迟。 我目前正在使用Visual Studio将此应用程序打包到docker容器中,然后部署到Azure中的Linux应用程序服务。这一切都有效。我能够将docker容器发布到Azure容器注册表,然后将我的Linux应用程序服务指向该容器。容器成功启动,我
我开发了一个服务于rest服务的独立spring boot应用程序,我把它打包成了一个< code>jar,它运行正常。为了在生产服务器(Websphere)上发布它,我必须将它转换成一个< code>war。 我已经更新了我的<code>pom。xml添加以下行: 然后,我启动了,我得到了。因此,在Tomcat服务器上发布它可以正常工作,但在Liberty上我收到了错误: 我还修改了我的入口点,