【Spring】AOP注解開發(fā)及JDBC整合

AOP注解開發(fā)光速入門

  • 步驟一:引入相關(guān)的jar及配置文件
 * spring 的傳統(tǒng) AOP 的開發(fā)的包
      spring-aop-4.2.4.RELEASE.jar
      com.springsource.org.aopalliance-1.0.0.jar
 * aspectJ 的開發(fā)包
      com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
      spring-aspects-4.2.4.RELEASE.jar
引入AOP約束
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
  • 步驟二:編寫目標(biāo)類
public class ProductDao {
     public void save(){
        System.out.println("保存商品...");
     }
     public void update(){
        System.out.println("修改商品...");
     }
     public void delete(){
        System.out.println("刪除商品...");
     }
     public void find(){
        System.out.println("查詢商品...");
     }
}
<!-- 目標(biāo)類============ -->
<bean id="productDao" class="cn.itcast.spring.demo4.ProductDao"></bean>
  • 步驟三:開啟aop注解自動代理
<aop:aspectj-autoproxy/>
  • 常用AspectJ 的AOP注解
    @Aspect:定義切面類的注解
    通知類型:
        * @Before  :前置通知
        * @AfterReturing :后置通知
        * @Around  :環(huán)繞通知
        * @After :最終通知
        * @AfterThrowing :異常拋出通知.
    @Pointcut:定義切入點的注解
  • ** 步驟四:編寫切面類**
@Aspect
public class MyAspectAnno {
    @Before("MyAspectAnno.pointcut1()")
    public void before(){
      System.out.println("前置通知===========");
    }
    @Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.save(..))")
     private void pointcut1(){}
}
<!-- 配置切面類 -->
<bean id="myAspectAnno" class="cn.itcast.spring.demo4.MyAspectAnno"></bean>
  • 步驟五:其他通知的注解
@Aspect
public class MyAspectAnno {
    @Before("MyAspectAnno.pointcut1()")
    public void before(){
      System.out.println("前置通知===========");
    }
    @AfterReturning("MyAspectAnno.pointcut2()")
    public void afterReturning(){
      System.out.println("后置通知===========");
   }
    @Around("MyAspectAnno.pointcut3()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
      System.out.println("環(huán)繞前通知==========");
      Object obj = joinPoint.proceed();
      System.out.println("環(huán)繞后通知==========");
      return obj;
    }
    @AfterThrowing("MyAspectAnno.pointcut4()")
    public void afterThrowing(){
      System.out.println("異常拋出通知========");
    }
    @After("MyAspectAnno.pointcut4()")
    public void after(){
      System.out.println("最終通知==========");
    }
    @Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.save(..))")
    private void pointcut1(){}
    @Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.update(..))")
    private void pointcut2(){}
    @Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.delete(..))")
    private void pointcut3(){}
    @Pointcut("execution(* cn.itcast.spring.demo4.ProductDao.find(..))")
    private void pointcut4(){}
}

Spring與JDBC整合

  • Spring 提供了很多持久層技術(shù)的模板類簡化編程
    其實就是提供了一個可以進行數(shù)據(jù)庫操作的對象牍帚,封裝了JDBC技術(shù)
  • 使用入門
  • 步驟一:引入相關(guān)開發(fā)包
  • 步驟二:創(chuàng)建一個測試類
@Test
// JDBC 模板的基本使用:
public void demo1(){
      DriverManagerDataSource dataSource = new DriverManagerDataSource();
      dataSource.setDriverClassName("com.mysql.jdbc.Driver");
      dataSource.setUrl("jdbc:mysql:///spring_day03");
      dataSource.setUsername("root");
      dataSource.setPassword("123");
      JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
      jdbcTemplate.update("insert into account values (null,?,?)", " 會 希
     ",10000d);
}
  • 步驟三:將連接池的配置交給Spring管理
    • 1.Spring 內(nèi)置的連接池的配置
    <!-- 配置 Spring 的內(nèi)置連接池 -->
    

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///spring_day02"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
```

測試類編寫
**** 引入 spring-aop.jar
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo2 {
        @Resource(name="jdbcTemplate")
        private JdbcTemplate jdbcTemplate;
        @Test
        public void demo1(){
        jdbcTemplate.update("insert into account values (null,?,?)", " 鳳 姐
",10000d);
        }
}
- **2.Spring中配置DBCP連接池**

【引入dbcp連接池的jar包】



【配置連接池】

<!-- 配置 DBCP 連接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///spring_day02"/>
        <property name="username" value="root"/>
        <property name="password" value="123"/>
</bean>
- **Spring中配置c3p0連接池**

【引入相應(yīng)的 jar 包】



【配置連接池】

<!-- 配置 C3P0 連接池 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql:///spring_day02"/>
        <property name="user" value="root"/>
        <property name="password" value="123"/>
</bean>
  • 步驟四: JDBC模板CRUD的操作
RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class SpringDemo3 {
      @Resource(name="jdbcTemplate")
      private JdbcTemplate jdbcTemplate;
      @Test
      // 插入操作
      public void demo1(){
        jdbcTemplate.update("insert into account values (null,?,?)", " 冠 希
",10000d);
      }
      @Test
      // 修改操作
      public void demo2(){
        jdbcTemplate.update("update account set name=?,money =? where id = ?", "
思雨",10000d,5);
      }
      @Test
      // 刪除操作
      public void demo3(){
        jdbcTemplate.update("delete from account where id = ?", 5);
      }
      @Test
      // 查詢一條記錄
      public void demo4(){
        Account account = jdbcTemplate.queryForObject("select * from account where id = ?", new MyRowMapper(), 1);
        System.out.println(account);
      }
      @Test
      // 查詢所有記錄
      public void demo5(){
        List<Account> list = jdbcTemplate.query("select * from account", new
MyRowMapper());
        for (Account account : list) {
          System.out.println(account);
        }
      }
      class MyRowMapper implements RowMapper<Account>{
        @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;
        }  
      }
}
  • Spring中控制事務(wù)
    • 事務(wù)回顧
    什么是事務(wù):
    事務(wù)邏輯上的一組操作,組成這組操作的各個邏輯單元,要么一起成功,要么一起失敗
    
    事務(wù)特性:
原子性 :強調(diào)事務(wù)的不可分割.
一致性 :事務(wù)的執(zhí)行的前后數(shù)據(jù)的完整性保持一致.
隔離性 :一個事務(wù)執(zhí)行的過程中,不應(yīng)該受到其他事務(wù)的干擾
持久性 :事務(wù)一旦結(jié)束,數(shù)據(jù)就持久到數(shù)據(jù)庫

    如果不考慮隔離性引發(fā)安全性問題:
臟讀  :一個事務(wù)讀到了另一個事務(wù)的未提交的數(shù)據(jù)
不可重復(fù)讀 :一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交的 update 的數(shù)據(jù)導(dǎo)致多次查詢結(jié)果不一致.
虛幻讀 :一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交的 insert 的數(shù)據(jù)導(dǎo)致多次查詢結(jié)果不一致.

    解決讀問題: 設(shè)置事務(wù)隔離級別
未提交讀  :臟讀晦嵌,不可重復(fù)讀腋逆,虛讀都有可能發(fā)生
已提交讀  :避免臟讀败京。但是不可重復(fù)讀和虛讀有可能發(fā)生
可重復(fù)讀  :避免臟讀和不可重復(fù)讀.但是虛讀有可能發(fā)生.
串行化的  :避免以上所有讀問題.
Mysql 默認(rèn):可重復(fù)讀
Oracle 默認(rèn):讀已提交
  • Spring PlatformTransactionManager: 平臺事務(wù)管理器
***** 真正管理事務(wù)的對象
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用SpringJDBC或iBatis進行持久化數(shù)據(jù)時使用
org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate進行持久化數(shù)據(jù)時使用 
  • TransactionDefinition:事務(wù)定義信息
    事務(wù)定義信息:
    * 隔離級別
    * 傳播行為
    * 超時信息
    * 是否只讀
  • TransactionStatus:記錄事務(wù)的狀態(tài)
  • 事務(wù)的傳播行為
PROPAGION_XXX  :事務(wù)的傳播行為
    * 保證同一個事務(wù)中
PROPAGATION_REQUIRED 支持當(dāng)前事務(wù)颈嚼,如果不存在 就新建一個(默認(rèn))
PROPAGATION_SUPPORTS 支持當(dāng)前事務(wù),如果不存在饲嗽,就不使用事務(wù)PROPAGATION_MANDATORY  支持當(dāng)前事務(wù)屁倔,如果不存在票罐,拋出異常
   * 保證沒有在同一個事務(wù)中
PROPAGATION_REQUIRES_NEW  如果有事務(wù)存在叉趣,掛起當(dāng)前事務(wù),創(chuàng)建一個新的事務(wù)
PROPAGATION_NOT_SUPPORTED  以非事務(wù)方式運行该押,如果有事務(wù)存在疗杉,掛起當(dāng)前事務(wù)
PROPAGATION_NEVER 以非事務(wù)方式運行,如果有事務(wù)存在蚕礼,拋出異常
PROPAGATION_NESTED 如果當(dāng)前事務(wù)存在烟具,則嵌套事務(wù)執(zhí)行
  • Spring聲明式事務(wù)管理XML方式 思想就是 AOP
配置事務(wù)管理器
<!-- 事務(wù)管理器 -->
<bean  id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource"/>
</bean>
配置事務(wù)的通知
<!-- 配置事務(wù)的增強 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <!--
      isolation="DEFAULT" 隔離級別
      propagation="REQUIRED" 傳播行為
      read-only="false"  只讀
      timeout="-1"  過期時間
      rollback-for="" -Exception
      no-rollback-for="" +Exception
      -->
      <tx:method name="transfer" propagation="REQUIRED"/>
    </tx:attributes>
</tx:advice>
配置 aop 
<aop:config>
    <aop:pointcut expression="execution(*cn.itcast.transaction.demo2.AccountServiceImpl.transfer(..))" id="pointcut1"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut1"/>
</aop:config>
  • Spring聲明式事務(wù)管理 注解方式
<!-- 配置事務(wù)管理器 -->
<bean  id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!-- 開啟注解事務(wù)管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
  • 在使用事務(wù)的類上添加一個注解:@Transactional
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市奠蹬,隨后出現(xiàn)的幾起案子朝聋,更是在濱河造成了極大的恐慌,老刑警劉巖罩润,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件玖翅,死亡現(xiàn)場離奇詭異,居然都是意外死亡割以,警方通過查閱死者的電腦和手機金度,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來严沥,“玉大人猜极,你說我怎么就攤上這事∠” “怎么了跟伏?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翩瓜。 經(jīng)常有香客問我受扳,道長,這世上最難降的妖魔是什么兔跌? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任勘高,我火速辦了婚禮,結(jié)果婚禮上坟桅,老公的妹妹穿的比我還像新娘华望。我一直安慰自己,他們只是感情好仅乓,可當(dāng)我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布赖舟。 她就那樣靜靜地躺著,像睡著了一般夸楣。 火紅的嫁衣襯著肌膚如雪宾抓。 梳的紋絲不亂的頭發(fā)上子漩,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天,我揣著相機與錄音石洗,去河邊找鬼痛单。 笑死,一個胖子當(dāng)著我的面吹牛劲腿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸟妙,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼焦人,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了重父?” 一聲冷哼從身側(cè)響起花椭,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎房午,沒想到半個月后矿辽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡郭厌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年袋倔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片折柠。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宾娜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出扇售,到底是詐尸還是另有隱情前塔,我是刑警寧澤,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布承冰,位于F島的核電站华弓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏困乒。R本人自食惡果不足惜寂屏,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望顶燕。 院中可真熱鬧凑保,春花似錦、人聲如沸涌攻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恳谎。三九已至芝此,卻和暖如春憋肖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背婚苹。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工岸更, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人膊升。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓怎炊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親廓译。 傳聞我的和親對象是個殘疾皇子评肆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)非区,斷路器瓜挽,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Spring 復(fù)習(xí) [toc] spring介紹 三層架構(gòu)中spring位置,連接三層征绸。 spring一站式框架正...
    inke閱讀 744評論 0 11
  • 一> 代理模式 概述 代理(Proxy)是一種設(shè)計模式久橙, 提供了對目標(biāo)對象另外的訪問方式;即通過代理訪問目標(biāo)對象管怠。...
    奮斗的老王閱讀 1,101評論 0 50
  • 1.IOC與DI inverse of control 控制反轉(zhuǎn)我們創(chuàng)建對象的方式反轉(zhuǎn)了淆衷。以前對象的創(chuàng)建由開發(fā)人員...
    蕊er閱讀 316評論 0 0
  • 中國建設(shè)傳媒網(wǎng)訊日前,中國國土經(jīng)濟學(xué)會房地產(chǎn)資源專業(yè)委員會設(shè)置增值中心(以下簡稱中國房資委增值中心)啟動儀式在北京...
    中國文旅新網(wǎng)閱讀 634評論 0 0