成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Spring筆記04_AOP注解開(kāi)發(fā)_模板_事務(wù)

youkede / 1845人閱讀

摘要:后置增強(qiáng)周杰倫環(huán)繞通知在切面類(lèi)中添加以下方法環(huán)繞通知環(huán)繞前增強(qiáng)環(huán)繞前增強(qiáng)測(cè)試前置增強(qiáng)保存訂單。。。不使用事務(wù)管理。

1. Spring基于AspectJ的注解的AOP開(kāi)發(fā) 1. 1 SpringAOP的注解入門(mén)

創(chuàng)建項(xiàng)目,導(dǎo)入jar包

需要導(dǎo)入Spring基礎(chǔ)包4+2

需要導(dǎo)入AOP聯(lián)盟包、AspectJ包、Spring整合Aspect包Spring-aop包

Spring整合單元測(cè)試包

引入配置文件applicationContext.xml



    

編寫(xiě)目標(biāo)類(lèi)并配置

package com.itzhouq.spring.demo1;

public class OrderDao {
    public void save() {
        System.out.println("保存訂單。。。");
    }
    public void update() {
        System.out.println("修改訂單。。。");
    }
    public void find() {
        System.out.println("查找訂單。。。");
    }
    public String delete() {
        System.out.println("刪除訂單。。。");
        return "周杰倫";
    }
}

配置目標(biāo)類(lèi),將目標(biāo)類(lèi)OrderDao交給Spring管理

在applicationContext.xml中添加


    

編寫(xiě)切面類(lèi)并配置

  package com.itzhouq.spring.demo1;
  /*
   * 切面類(lèi):注解的切面類(lèi)
   */
  public class MyAspectAnno {
      
      public void before() {
          System.out.println("前置增強(qiáng)===============");
      }
  }

    

使用注解的AOP對(duì)目標(biāo)類(lèi)的方法進(jìn)行增強(qiáng)

首先在配置文件中打開(kāi)注解的AOP開(kāi)發(fā)


    

在切面類(lèi)上使用注解

/*
     * 切面類(lèi):注解的切面類(lèi)
     */
    @Aspect    //標(biāo)記該類(lèi)為切面類(lèi)
    public class MyAspectAnno {
        
        @Before(value="execution(* com.itzhouq.spring.demo1.OrderDao.save(..))")
        public void before() {//這個(gè)注解用來(lái)標(biāo)記目標(biāo)類(lèi)的哪個(gè)方法使用何種增強(qiáng)
            System.out.println("前置增強(qiáng)===============");
        }
    }

測(cè)試

package com.itzhouq.spring.demo1;
  
  import javax.annotation.Resource;
  
  import org.junit.Test;
  import org.junit.runner.RunWith;
  import org.springframework.test.context.ContextConfiguration;
  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  
  /*
   * Spring的AOP注解開(kāi)發(fā)測(cè)試
   */
  
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration("classpath:applicationContext.xml")
  public class SpringDemo1 {
      @Resource(name="orderDao")    //注入OrderDao
      private OrderDao orderDao;
      
      @Test
      public void test1() {
          orderDao.save();
          orderDao.update();
          orderDao.find();
          orderDao.delete();
  //        前置增強(qiáng)===============
  //        保存訂單。。。
  //        修改訂單。。。
  //        查找訂單。。。
  //        刪除訂單。。。
  
      }
  }
1.2 Spring的AOP的注解通知類(lèi)型 1.2.1 @Before:前置通知 1.2.2 @AfterReturning:后置通知

在刪除delete方法上使用后置通知

在切面類(lèi)中添加以下方法

//后置通知
    @AfterReturning("execution(* com.itzhouq.spring.demo1.OrderDao.delete(..))")
    public void afterReturning() {
        System.out.println("后置增強(qiáng)==================");
    }

不用修改目標(biāo)類(lèi)直接測(cè)試就能實(shí)現(xiàn)效果

前置增強(qiáng)===============
保存訂單。。。
修改訂單。。。
查找訂單。。。
刪除訂單。。。
后置增強(qiáng)==================

后置通知還可以使用返回值

//后置通知
    @AfterReturning(value="execution(* com.itzhouq.spring.demo1.OrderDao.delete(..))", returning="result")
    public void afterReturning(Object result) {
        System.out.println("后置增強(qiáng)=================="+result);
    }
前置增強(qiáng)===============
保存訂單。。。
修改訂單。。。
查找訂單。。。
刪除訂單。。。
后置增強(qiáng)==================周杰倫

1.2.3 環(huán)繞通知

在切面類(lèi)中添加以下方法:

//環(huán)繞通知
    @Around(value="execution(* com.itzhouq.spring.demo1.OrderDao.update(..))")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("環(huán)繞前增強(qiáng)===========");
        Object obj = joinPoint.proceed();
        System.out.println("環(huán)繞前增強(qiáng)===========");
        return obj;
    }

測(cè)試

前置增強(qiáng)===============
保存訂單。。。
環(huán)繞前增強(qiáng)===========
修改訂單。。。
環(huán)繞前增強(qiáng)===========
查找訂單。。。
刪除訂單。。。
后置增強(qiáng)==================周杰倫

1.2.4 異常拋出通知

異常拋出通知可以獲得異常信息

在切面類(lèi)中添加方法

    //異常拋出通知
    @AfterThrowing(value="execution(* com.itzhouq.spring.demo1.OrderDao.find(..))",throwing="e")
    public void afterThrowing(Throwable e) {
        System.out.println("異常拋出通知============"+e);
    }

在find方法中模擬異常

public void find() {
        System.out.println("查找訂單。。。");
        int i = 1 / 0;
    }

測(cè)試

前置增強(qiáng)===============
保存訂單。。。
環(huán)繞前增強(qiáng)===========
修改訂單。。。
環(huán)繞前增強(qiáng)===========
查找訂單。。。
異常拋出通知============java.lang.ArithmeticException: / by zero

1.2.5 最終通知‘

在切面類(lèi)中添加方法

//最終通知
    @After(value="execution(* com.itzhouq.spring.demo1.OrderDao.find(..))")
    public void after() {
        System.out.println("最終增強(qiáng)============");
    }

測(cè)試

前置增強(qiáng)===============
保存訂單。。。
環(huán)繞前增強(qiáng)===========
修改訂單。。。
環(huán)繞前增強(qiáng)===========
查找訂單。。。
最終增強(qiáng)============
異常拋出通知============java.lang.ArithmeticException: / by zero

1.3 Spring的AOP的注解的切入點(diǎn)的注解

修改切面類(lèi)

package com.itzhouq.spring.demo1;
  
  import org.aspectj.lang.ProceedingJoinPoint;
  import org.aspectj.lang.annotation.After;
  import org.aspectj.lang.annotation.AfterReturning;
  import org.aspectj.lang.annotation.AfterThrowing;
  import org.aspectj.lang.annotation.Around;
  import org.aspectj.lang.annotation.Aspect;
  import org.aspectj.lang.annotation.Before;
  import org.aspectj.lang.annotation.Pointcut;
  
  /*
   * 切面類(lèi):注解的切面類(lèi)
   */
  @Aspect    //標(biāo)記該類(lèi)為切面類(lèi)
  public class MyAspectAnno {
      
      @Before(value="MyAspectAnno.pointcut2()")
      public void before() {//這個(gè)注解用來(lái)標(biāo)記目標(biāo)類(lèi)的哪個(gè)方法使用何種增強(qiáng)
          System.out.println("前置增強(qiáng)===============");
      }
      
      //后置通知
      @AfterReturning(value="execution(* com.itzhouq.spring.demo1.OrderDao.delete(..))", returning="result")
      public void afterReturning(Object result) {
          System.out.println("后置增強(qiáng)=================="+result);
      }
      
      //環(huán)繞通知
      @Around(value="MyAspectAnno.pointcut3()")
      public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
          System.out.println("環(huán)繞前增強(qiáng)===========");
          Object obj = joinPoint.proceed();
          System.out.println("環(huán)繞前增強(qiáng)===========");
          return obj;
      }
      
      //異常拋出通知
      @AfterThrowing(value="MyAspectAnno.pointcut4()",throwing="e")
      public void afterThrowing(Throwable e) {
          System.out.println("異常拋出通知============"+e);
      }
      
      //最終通知
      @After(value="MyAspectAnno.pointcut1()")
      public void after() {
          System.out.println("最終增強(qiáng)============");
      }
      
      //切入點(diǎn)注解
      @Pointcut(value="execution(* com.itzhouq.spring.demo1.OrderDao.find(..))")
      private void pointcut1() {}
      @Pointcut(value="execution(* com.itzhouq.spring.demo1.OrderDao.save(..))")
      private void pointcut2() {}
      @Pointcut(value="execution(* com.itzhouq.spring.demo1.OrderDao.update(..))")
      private void pointcut3() {}
      @Pointcut(value="execution(* com.itzhouq.spring.demo1.OrderDao.delete(..))")
      private void pointcut4() {}
  }

通過(guò)切入點(diǎn)的注解,可以簡(jiǎn)化注解的代碼量

注意:使用類(lèi)名.pointcut1()時(shí)候不要忘記pointcut1()是一個(gè)方法,需要帶上()才有效

2. Spring的JDBC的模板的使用 2.1 Spring的JDBC的模板

Spring的EE開(kāi)發(fā)的一站式的框架,有EE開(kāi)發(fā)中每一層的解決方案。Spring對(duì)持久層也提供了解決方案:ORM模塊和JDBC的模塊。

Spring提供了很多的模板用于簡(jiǎn)化開(kāi)發(fā)。

2.1.1 JDBC模板使用的入門(mén)

創(chuàng)建項(xiàng)目,引入jar包

引入基本的4+2包

數(shù)據(jù)庫(kù)驅(qū)動(dòng)包

Spring的JDBC模板的jar包:事務(wù)管理tx和jdbc的包

單元測(cè)試包

創(chuàng)建數(shù)據(jù)庫(kù)和表

create database spring4_day03;
use spring4_day03;
create table account(
    id int primary key auto_increment,
    name varchar(20),
    money double
)

使用JDBC模板:保存數(shù)據(jù)

package com.itzhouq.spring.jdbc.demo1;
  
  import org.junit.Test;
  import org.springframework.jdbc.core.JdbcTemplate;
  import org.springframework.jdbc.datasource.DriverManagerDataSource;
  
  /*
   * JDBC的模板使用
   */
  public class JdbcDemo1 {
      @Test    //JDBC的模板的使用類(lèi)似于Dbutils
      public void test1() {
          //創(chuàng)建連接池    這里使用Spring默認(rèn)的連接池
          DriverManagerDataSource dataSource = new DriverManagerDataSource();
          dataSource.setDriverClassName("com.mysql.jdbc.Driver");
          dataSource.setUrl("jdbc:mysql:///spring4_day03");
          dataSource.setUsername("root");
          dataSource.setPassword("2626");
          
          //創(chuàng)建jdbc模板
          JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
          jdbcTemplate.update("insert into account values (null, ?,?)", "周杰倫",10000d);
      }
  
  }

將日志記錄的配置文件jdbc.properties拷貝到src下

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring4_day03
jdbc.username=root
jdbc.password=2626

測(cè)試能插入數(shù)據(jù)

2.1.2 將連接池和模板交給Spring管理

引入aop的jar包

引入Spring的配置文件applicationContext.xml



    
    

配置Spring的內(nèi)置連接池,將連接池交給Spring管理


    
        
        
        
        
        
    

配置Spring的jdbc模板,將模板交給Spring管理


    
        
    

使用JDBC的模板

package com.itzhouq.spring.jdbc.demo1;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value="classpath:applicationContext.xml")
public class JdbcDemo2 {
    @Resource(name="jdbcTemplate")
    private JdbcTemplate jdbcTemplate;
    
    @Test
    public void test1() {
        jdbcTemplate.update("insert into account values (null, ?,?)", "趙雷",10000d);
    }
}

測(cè)試能插入數(shù)據(jù)

2.2 使用開(kāi)源的數(shù)據(jù)庫(kù)連接池 2.2.1 C3P0的使用

導(dǎo)入jar包

com.springsource.com.mchange.v2.c3p0-0.9.1.2.jar

路徑

..spring-framework-3.0.2.RELEASE-dependenciescom.mchange.c3p0com.springsource.com.mchange.v2.c3p0

配置C3P0連接池


    
        
        
        
        
        
     
    
    
        
    

注意:C3P0連接池的核心類(lèi)是:com.mchange.v2.c3p0.ComboPooledDataSource

測(cè)試能插入數(shù)據(jù)

2.2.2 DBCP的使用

引入jar包

com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar

com.springsource.org.apache.commons.pool-1.5.3.jar

路徑

..spring-framework-3.0.2.RELEASE-dependenciesorg.apache.commonscom.springsource.org.apache.commons.dbcp

..spring-framework-3.0.2.RELEASE-dependenciesorg.apache.commonscom.springsource.org.apache.commons.pool

配置DBCP的連接池


    
        屬性注入 ===============
        
        
        
        
    
    
    
    
        
    

注意:DBCP的核心類(lèi)為org.apache.commons.dbcp.BasicDataSource。

測(cè)試能插入數(shù)據(jù)

2.3 抽取配置到屬性文件

在src下新建配置文件jdbc.properties

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/spring4_day03
jdbc.username=root
jdbc.password=2626

在Spring的配置文件中引入屬性文件


    
    
    
        
        
        
        
        
     

測(cè)試能插入數(shù)據(jù)

2.4 使用JDBC模板進(jìn)行CURD操作 2.4.1 增
package com.itzhouq.spring.jdbc.demo1;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value="classpath:applicationContext.xml")
public class JdbcDemo2 {
    @Resource(name="jdbcTemplate")
    private JdbcTemplate jdbcTemplate;
    
    @Test
    public void test1() {
        jdbcTemplate.update("insert into account values (null, ?,?)", "YYY",10000d);
    }
}
2.4.2 刪
@Test
    public void test3() {//刪除
        jdbcTemplate.update("delete from account where id = ?", 5);
    }
2.4.3 改
@Test
    public void test2() {//修改
        jdbcTemplate.update("update account set name = ?, money =  ? where id = ?", "何巨濤",10000d, 6);
    }
2.4.4 查

查詢(xún)某個(gè)屬性

@Test
    public void test4() {//查詢(xún)某個(gè)屬性
        String name = jdbcTemplate.queryForObject("select name from account where id = ?", String.class, 6);
        System.out.println(name);
    }

查詢(xún)個(gè)數(shù)

@Test
    public void test5() {//查詢(xún)個(gè)數(shù)
        Long count = jdbcTemplate.queryForObject("select count(*) from account", Long.class);
        System.out.println(count);
    }

返回的是對(duì)象

首先要?jiǎng)?chuàng)建一個(gè)實(shí)體Account

@Test
    public void test6() {//封裝到一個(gè)對(duì)象中
        Account  account = jdbcTemplate.queryForObject("select * from account where id = ?", new MyRowMapper(), 4);
        System.out.println(account);
    }
    
    class MyRowMapper  implements RowMapper{

        @Override
        public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
            Account account = new Account();
            account.setId(rs.getInt("id"));
            account.setName(rs.getString("name"));
            account.setMoney(rs.getDouble("money"));
            return account;
        }
    }

queryForObject的第二個(gè)參數(shù)需要實(shí)現(xiàn)一個(gè)接口RowMapper

查詢(xún)多條記錄

@Test
    public void test7() {
        List listAccount = jdbcTemplate.query("select * from account", new MyRowMapper());
        for (Account account : listAccount) {
            System.out.println(account);
        }
    }
    
    class MyRowMapper  implements RowMapper{

        @Override
        public Account mapRow(ResultSet rs, int rowNum) throws SQLException {
            Account account = new Account();
            account.setId(rs.getInt("id"));
            account.setName(rs.getString("name"));
            account.setMoney(rs.getDouble("money"));
            return account;
        }
    }

3. Spring的事務(wù)管理 3.1 事務(wù)的回顧 3.1.1 什么是事務(wù)

事務(wù):邏輯上的一組操作,組成這組操作的各個(gè)單元,要么全都成功,要么全都失敗。

3.1.2 事務(wù)的特性

原子性:事務(wù)不可分割

一致性:事務(wù)執(zhí)行前后數(shù)據(jù)完整性保持一致

隔離性:一個(gè)事務(wù)的執(zhí)行不應(yīng)該受到其他事務(wù)的影響

持久性:一旦事務(wù)結(jié)束,數(shù)據(jù)就持久化到數(shù)據(jù)庫(kù)中

3.1.3 不考慮事務(wù)的隔離性引發(fā)安全問(wèn)題

讀問(wèn)題

臟讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)未提交的數(shù)據(jù)

不可重復(fù)讀:一個(gè)事務(wù)讀取到另一個(gè)事務(wù)已經(jīng)提交的update的數(shù)據(jù),導(dǎo)致一個(gè)事務(wù)中多次查詢(xún)結(jié)果不一致

虛讀、幻讀:一個(gè)事務(wù)讀到另一個(gè)事務(wù)已經(jīng)提交的insert數(shù)據(jù),導(dǎo)致一個(gè)事務(wù)中多次查詢(xún)結(jié)果不一致

寫(xiě)問(wèn)題

丟失更新

3.1.4 解決讀問(wèn)題

設(shè)置事務(wù)的隔離級(jí)別

read uncommited:未提交讀,任何讀問(wèn)題都解決不了

Read commited:已提交讀,解決臟讀,但是不可重復(fù)讀和虛讀有可能發(fā)生

Repeatable read:重復(fù)讀,解決臟讀和不可重復(fù)讀,但是虛讀有可能發(fā)生

Serializable:解決所有讀問(wèn)題

3.2 Spring的事務(wù)管理的API 3.2. 1 PlatformTransactionManager:平臺(tái)事務(wù)管理器

平臺(tái)事務(wù)管理器:接口,是Spring用于管理事務(wù)的真正的對(duì)象。

DataSourceTransactionManager:底層使用JDBC管理事務(wù)

HibernateTransactionManager:底層使用Hibernate管理事務(wù)

3.2.2 TransactionDefinition:事務(wù)定義信息

事務(wù)定義:用于定義事務(wù)的相關(guān)的信息,隔離級(jí)別、超時(shí)信息、傳播行為、是否只讀

3.2.3 TransactionStatus:事務(wù)的狀態(tài)

l 事務(wù)狀態(tài):用于記錄在事務(wù)管理過(guò)程中,事務(wù)的狀態(tài)的對(duì)象。

3.2.4 事務(wù)管理的API的關(guān)系

Spring進(jìn)行事務(wù)管理的時(shí)候,首先平臺(tái)事務(wù)管理器根據(jù)事務(wù)定義信息進(jìn)行事務(wù)的管理,在事務(wù)管理過(guò)程中,產(chǎn)生各種狀態(tài),將這些狀態(tài)的信息記錄到事務(wù)狀態(tài)的對(duì)象中。

3.3 事務(wù)的傳播行為

Spring中提供了七種事務(wù)的傳播行為

3.3.1 保證多個(gè)操作在同一個(gè)事務(wù)中

PROPAGATION_REQUIRED:默認(rèn)值,如果A中有事務(wù),使用A中的事務(wù),如果A沒(méi)有,創(chuàng)建一個(gè)新的事務(wù),將操作包含進(jìn)來(lái)

PROPAGATION_SUPPORTS:支持事務(wù),如果A中有事務(wù),使用A中的事務(wù)。如果A沒(méi)有事務(wù),不使用事務(wù)。

PROPAGATION_MANDATORY:如果A中有事務(wù),使用A中的事務(wù)。如果A沒(méi)有事務(wù),拋出異常。

3.3.2 保證多個(gè)操作不在同一個(gè)事務(wù)中

PROPAGATION_REQUIRES_NEW:如果A中有事務(wù),將A的事務(wù)掛起(暫停),創(chuàng)建新事務(wù),只包含自身操作。如果A中沒(méi)有事務(wù),創(chuàng)建一個(gè)新事務(wù),包含自身操作。

PROPAGATION_NOT_SUPPORTED:如果A中有事務(wù),將A的事務(wù)掛起。不使用事務(wù)管理。

PROPAGATION_NEVER:如果A中有事務(wù),報(bào)異常。

3.3.3 嵌套式事務(wù)

PROPAGATION_NESTED:嵌套事務(wù),如果A中有事務(wù),按照A的事務(wù)執(zhí)行,執(zhí)行完成后,設(shè)置一個(gè)保存點(diǎn),執(zhí)行B中的操作,如果沒(méi)有異常,執(zhí)行通過(guò),如果有異常,可以選擇回滾到最初始位置,也可以回滾到保存點(diǎn)。

3.4 事務(wù)的管理 3.4.1 案例:轉(zhuǎn)賬

創(chuàng)建AccountService接口

package com.itzhouq.spring.tx.demo1;
  /*
   * 轉(zhuǎn)賬的業(yè)務(wù)層的接口
   */
  public interface AccountService {
      public void transfer(String from, String to, Double money);
  }

創(chuàng)建接口實(shí)現(xiàn)類(lèi)AccountServiceImpl

package com.itzhouq.spring.tx.demo1;
  /*
   * 轉(zhuǎn)賬的業(yè)務(wù)層的實(shí)現(xiàn)類(lèi)
   */
  public class AccountServiceImpl implements AccountService {
      
      //注入DAO
      private AccountDao accountDao;
      public void setAccountDao(AccountDao accountDao) {
          this.accountDao = accountDao;
      }
  
      /**
       *     from:轉(zhuǎn)出賬戶(hù)
       *     to:轉(zhuǎn)入賬戶(hù)
       *     money:轉(zhuǎn)賬金額
       */
      @Override
      public void transfer(String from, String to, Double money) {
          accountDao.outMoney(from, money);
          int i = 1 / 0;
          accountDao.inMoney(to, money);
      }
  }

創(chuàng)建AccountDao接口

 package com.itzhouq.spring.tx.demo1;
  /*
   * 轉(zhuǎn)賬的DAO的接口
   */
  public interface AccountDao {
      public void outMoney(String from, Double money);
      public void inMoney(String to, Double money);
  }

創(chuàng)建AccountDao實(shí)現(xiàn)類(lèi)AccountDaoImpl

package com.itzhouq.spring.tx.demo1;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
    
    @Override
    public void outMoney(String from, Double money) {
        this.getJdbcTemplate().update("update account set money=money-? where name=?", money,from);
    }

    @Override
    public void inMoney(String to, Double money) {
        this.getJdbcTemplate().update("update account set money=money+? where name=?", money,to);
    }
}

配置Service和Dao:交給Spring管理

復(fù)制applicationContext.xml文件,新建配置文件tx.xml


    
        
    
    
    
    
        
    

在Dao中編寫(xiě)扣錢(qián)和加錢(qián)

配置連接池和JDBC的模板





    
    
    
    
    
 


    

在Dao中注入jdbc的模板

方法一:在Dao中直接注入

package com.itzhouq.spring.tx.demo1;

import org.springframework.jdbc.core.JdbcTemplate;

public class AccountDaoImpl implements AccountDao {
    
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }

    @Override
    public void outMoney(String from, Double money) {
        

    }

    @Override
    public void inMoney(String to, Double money) {

    }
}

方法二:AccountDaoImpl繼承JdbcDaoSupport

JdbcDaoSupport類(lèi)中提供了模板,也提供了set方法

package com.itzhouq.spring.tx.demo1;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao {
    
    @Override
    public void outMoney(String from, Double money) {

    }

    @Override
    public void inMoney(String to, Double money) {

    }
}

所以直接在xml文件中的dao注入模板


    
        
    

方法三:繼承JdbcDaoSupport類(lèi)之后直接注入連接池,這樣連接池可以自動(dòng)創(chuàng)建模板

不用配置模板,直接dao中注入連接池



    
        
    

    
        
    

配置文件



    
    
    
        
    
    
    
    
        
     
    
    
    
    
    
        
        
        
        
        
     
    
    
        

測(cè)試

package com.itzhouq.spring.tx.demo1;
  
  import javax.annotation.Resource;
  
  import org.junit.Test;
  import org.junit.runner.RunWith;
  import org.springframework.test.context.ContextConfiguration;
  import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
  
  /*
   * 測(cè)試轉(zhuǎn)賬
   */
  @RunWith(SpringJUnit4ClassRunner.class)
  @ContextConfiguration("classpath:tx.xml")
  public class SpringDemo1 {
      @Resource(name="accountService")
      private AccountService accountService;
      
      @Test
      public void test1() {
          accountService.transfer("周杰倫", "鄧超", 1000d);
      }
  }

如果沒(méi)有異常能夠轉(zhuǎn)賬成功。但是沒(méi)有事務(wù)控制,一旦轉(zhuǎn)賬過(guò)程中出現(xiàn)異常就會(huì)出現(xiàn)數(shù)據(jù)丟失的現(xiàn)象。

3.4.2 Spring的事務(wù)管理

方式一:編程式事務(wù),需要手動(dòng)編碼【了解】

方式二:聲明式事務(wù),通過(guò)配置實(shí)現(xiàn)---AOP

3.4.3 聲明式事務(wù)

XML方式的聲明式的事務(wù)管理

引入jar包

aop聯(lián)盟包

aspectJ包

aop包

Spring整合aspectJ包

配置事務(wù)管理器


    
        
    

配置增強(qiáng)


    
        
            
            
            
        
    

AOP的配置


    
        
        
    

測(cè)試:如果轉(zhuǎn)賬出現(xiàn)異常,事務(wù)自動(dòng)回滾

注解方式聲明事務(wù)

引入aop的開(kāi)發(fā)包

配置事務(wù)管理


    
        
    

開(kāi)啟注解事務(wù)


    

在業(yè)務(wù)層添加注解

@Transactional
public class AccountServiceImpl implements AccountService {
    

測(cè)試:如果轉(zhuǎn)賬過(guò)程中出現(xiàn)異常,則自動(dòng)回滾。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74400.html

相關(guān)文章

  • Spring學(xué)習(xí)筆記

    摘要:介紹并不局限于某一層是對(duì)象的容器幫我們管理項(xiàng)目中的所有對(duì)象搭建導(dǎo)包直接新建項(xiàng)目,一般的都有,除了依賴(lài)準(zhǔn)備類(lèi)書(shū)寫(xiě)配置書(shū)寫(xiě)代碼測(cè)試中的概念反轉(zhuǎn)控制創(chuàng)建對(duì)象的方式反轉(zhuǎn)了從我們自己創(chuàng)建對(duì)象反轉(zhuǎn)給程序來(lái)創(chuàng)建依賴(lài)注入將必須的屬性注入到對(duì)象當(dāng)中是實(shí)現(xiàn)思想 1.spring介紹 spring并不局限于某一層.spring是對(duì)象的容器,幫我們管理項(xiàng)目中的所有對(duì)象 2.spring搭建 1.導(dǎo)包(idea...

    FleyX 評(píng)論0 收藏0
  • spring 入門(mén) 3 整合JDBC和AOP事務(wù)

    摘要:整合提供了很多模板整合技術(shù)持久化技術(shù)模板類(lèi)中提供了一個(gè)可以操作數(shù)據(jù)庫(kù)的對(duì)象對(duì)象封裝了技術(shù)模板對(duì)象與中的非常相似準(zhǔn)備連接池創(chuàng)建模板對(duì)象書(shū)寫(xiě)并執(zhí)行步驟導(dǎo)包基礎(chǔ)包類(lèi)庫(kù)新增連接池驅(qū)動(dòng)包包事務(wù)包準(zhǔn)備數(shù)據(jù)庫(kù)本地?cái)?shù)據(jù)庫(kù)和表書(shū)寫(xiě)使用模板實(shí)現(xiàn)增刪改查 spring整合JDBC spring提供了很多模板整合Dao技術(shù) ORM持久化技術(shù) 模板類(lèi) JDBC o...

    CHENGKANG 評(píng)論0 收藏0
  • SpringAOP模塊】就是這么簡(jiǎn)單

    摘要:可以通過(guò)切入點(diǎn)表達(dá)式,指定攔截哪些類(lèi)的哪些方法給指定的類(lèi)在運(yùn)行的時(shí)候植入切面類(lèi)代碼。 前言 到目前為止,已經(jīng)簡(jiǎn)單學(xué)習(xí)了Spring的Core模塊、....于是我們就開(kāi)啟了Spring的AOP模塊了...在講解AOP模塊之前,首先我們來(lái)講解一下cglib代理、以及怎么手動(dòng)實(shí)現(xiàn)AOP編程 cglib代理 在講解cglib之前,首先我們來(lái)回顧一下靜態(tài)代理和動(dòng)態(tài)代理....我之前就寫(xiě)過(guò)了靜態(tài)代...

    whjin 評(píng)論0 收藏0
  • Spring【DAO模塊】就是這么簡(jiǎn)單

    摘要:連接對(duì)象執(zhí)行命令對(duì)象執(zhí)行關(guān)閉值得注意的是,對(duì)數(shù)據(jù)庫(kù)連接池是有很好的支持的。給我們提供了事務(wù)的管理器類(lèi),事務(wù)管理器類(lèi)又分為兩種,因?yàn)榈氖聞?wù)和的事務(wù)是不一樣的。 前言 上一篇Spring博文主要講解了如何使用Spring來(lái)實(shí)現(xiàn)AOP編程,本博文主要講解Spring的DAO模塊對(duì)JDBC的支持,以及Spring對(duì)事務(wù)的控制... 對(duì)于JDBC而言,我們肯定不會(huì)陌生,我們?cè)诔鯇W(xué)的時(shí)候肯定寫(xiě)過(guò)非...

    NSFish 評(píng)論0 收藏0
  • 慕課網(wǎng)_Spring入門(mén)篇》學(xué)習(xí)總結(jié)

    摘要:入門(mén)篇學(xué)習(xí)總結(jié)時(shí)間年月日星期三說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門(mén)篇》學(xué)習(xí)總結(jié) 時(shí)間:2017年1月18日星期三說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://git...

    Ververica 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

youkede

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<