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

AOP注解開(kāi)發(fā)光速入門(mén)

  • 步驟一:引入相關(guān)的jar及配置文件
 * spring 的傳統(tǒng) AOP 的開(kāi)發(fā)的包
      spring-aop-4.2.4.RELEASE.jar
      com.springsource.org.aopalliance-1.0.0.jar
 * aspectJ 的開(kāi)發(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>
  • 步驟二:編寫(xiě)目標(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>
  • 步驟三:開(kāi)啟aop注解自動(dòng)代理
<aop:aspectj-autoproxy/>
  • 常用AspectJ 的AOP注解
    @Aspect:定義切面類的注解
    通知類型:
        * @Before  :前置通知
        * @AfterReturing :后置通知
        * @Around  :環(huán)繞通知
        * @After :最終通知
        * @AfterThrowing :異常拋出通知.
    @Pointcut:定義切入點(diǎn)的注解
  • ** 步驟四:編寫(xiě)切面類**
@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ù)的模板類簡(jiǎn)化編程
    其實(shí)就是提供了一個(gè)可以進(jìn)行數(shù)據(jù)庫(kù)操作的對(duì)象,封裝了JDBC技術(shù)
  • 使用入門(mén)
  • 步驟一:引入相關(guān)開(kāi)發(fā)包
  • 步驟二:創(chuàng)建一個(gè)測(cè)試類
@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,?,?)", " 會(huì) 希
     ",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>
```

測(cè)試類編寫(xiě)
**** 引入 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ù)邏輯上的一組操作,組成這組操作的各個(gè)邏輯單元,要么一起成功,要么一起失敗
    
    事務(wù)特性:
原子性 :強(qiáng)調(diào)事務(wù)的不可分割.
一致性 :事務(wù)的執(zhí)行的前后數(shù)據(jù)的完整性保持一致.
隔離性 :一個(gè)事務(wù)執(zhí)行的過(guò)程中,不應(yīng)該受到其他事務(wù)的干擾
持久性 :事務(wù)一旦結(jié)束,數(shù)據(jù)就持久到數(shù)據(jù)庫(kù)

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

    解決讀問(wèn)題: 設(shè)置事務(wù)隔離級(jí)別
未提交讀  :臟讀,不可重復(fù)讀,虛讀都有可能發(fā)生
已提交讀  :避免臟讀。但是不可重復(fù)讀和虛讀有可能發(fā)生
可重復(fù)讀  :避免臟讀和不可重復(fù)讀.但是虛讀有可能發(fā)生.
串行化的  :避免以上所有讀問(wèn)題.
Mysql 默認(rèn):可重復(fù)讀
Oracle 默認(rèn):讀已提交
  • Spring PlatformTransactionManager: 平臺(tái)事務(wù)管理器
***** 真正管理事務(wù)的對(duì)象
org.springframework.jdbc.datasource.DataSourceTransactionManager 使用SpringJDBC或iBatis進(jìn)行持久化數(shù)據(jù)時(shí)使用
org.springframework.orm.hibernate3.HibernateTransactionManager 使用Hibernate進(jìn)行持久化數(shù)據(jù)時(shí)使用 
  • TransactionDefinition:事務(wù)定義信息
    事務(wù)定義信息:
    * 隔離級(jí)別
    * 傳播行為
    * 超時(shí)信息
    * 是否只讀
  • TransactionStatus:記錄事務(wù)的狀態(tài)
  • 事務(wù)的傳播行為
PROPAGION_XXX  :事務(wù)的傳播行為
    * 保證同一個(gè)事務(wù)中
PROPAGATION_REQUIRED 支持當(dāng)前事務(wù),如果不存在 就新建一個(gè)(默認(rèn))
PROPAGATION_SUPPORTS 支持當(dāng)前事務(wù),如果不存在,就不使用事務(wù)PROPAGATION_MANDATORY  支持當(dāng)前事務(wù),如果不存在,拋出異常
   * 保證沒(méi)有在同一個(gè)事務(wù)中
PROPAGATION_REQUIRES_NEW  如果有事務(wù)存在,掛起當(dāng)前事務(wù),創(chuàng)建一個(gè)新的事務(wù)
PROPAGATION_NOT_SUPPORTED  以非事務(wù)方式運(yùn)行,如果有事務(wù)存在,掛起當(dāng)前事務(wù)
PROPAGATION_NEVER 以非事務(wù)方式運(yùn)行,如果有事務(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ù)的增強(qiáng) -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
      <!--
      isolation="DEFAULT" 隔離級(jí)別
      propagation="REQUIRED" 傳播行為
      read-only="false"  只讀
      timeout="-1"  過(guò)期時(shí)間
      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>
<!-- 開(kāi)啟注解事務(wù)管理 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
  • 在使用事務(wù)的類上添加一個(gè)注解:@Transactional
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,362評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,577評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,486評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,852評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,600評(píng)論 6 412
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,944評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,944評(píng)論 3 447
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,108評(píng)論 0 290
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,652評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,385評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,616評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,111評(píng)論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,798評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,205評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,537評(píng)論 1 295
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,334評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,570評(píng)論 2 379

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

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