1. 事务传播
require requireNew
- 使用propagation属性配置事务传播行为,即当前事务方法被另一个事务方法调用时
- 如何使用事务?
- 默认是REQUIRED,即使用调用方法的事务
- REQUIRES_NEW,开启一个新的事务,使用自己的事务,调用方法的事务被挂起
- 注意:查看这两个值对应数据库表中的变化
@Service("cashier")
public class CashierImpl implements Cashier{
@Autowired
private AccountService as;
@Transactional(propagation=Propagation.REQUIRES_NEW)
@Override
public void checkout(String name, List<String> isbns) {
for (String isbn : isbns) {
//价格只能购买一本书,数据库表数据是否发生变化
as.purchase(name, isbn);
}
2. SpringWEB(在web工程使用Spring)
web.xml
<web-app>
<!-- JavaWeb项目如何初始化IOC容器?
思路:当tomcat服务器启动时,通过监听器初始化或者实例化容器;
需要告诉监听器此容器的位置(context-param)
spring-web.jar-->
<!-- 1.配置IOC容器的位置,注意看ContextLoaderListener源码
2.未指定IOC容器位置,会采用默认位置(WEB-INF/applicationContext.xml),路径以及文件名必须一致
查看XmlWebApplicationContext类源码
-->
<context-param>
<!-- 监听器的父类中有个变量值contextConfigLocation,该值保存着IOC容器的位置 -->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:beans.xml</param-value>
</context-param>
<!-- 监听器<服务器一启动,加载配置文件> -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
beans.xml
<bean id="person" class="com.xxx.entity.Person">
<property name="id" value="001"></property>
<property name="name" value="liu"></property>
</bean>
getAttribute和WebApplicationContextUtils工具类 两种方法:
//WebApplicationContextUtils类源码112行
//ContextLoader类源码294行
//获取全局初始化参数方法getInitParameter
ServletContext sc=getServletContext();
WebApplicationContext wb=(WebApplicationContext) sc.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
String config =sc.getInitParameter("contextConfigLocation");
/*ApplicationContext ac=new ClassPathXmlApplicationContext(config);
Person person=(Person) ac.getBean("person");
System.out.println(person.toString());*/
ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(sc);
Person person = (Person)ac.getBean("person");
System.out.println(person);