Spring-Aop註解形式案例

南夏發表於2015-12-13
 

Spring-Aop註解形式案例<二>

問題?Spring-Aop註解形式案例

我們知道,在spring中,spring提供了註解的形式,來達到物件的依賴注入。當然我們也可以直接用依賴注入將bean


這裡寫的是Spring-Aop註解形式案例

工具類:

  1. package cn.itcast.spring.sh.aop;  
  2.   
  3. import org.hibernate.Session;  
  4. import org.hibernate.SessionFactory;  
  5. import org.hibernate.Transaction;  
  6. import org.hibernate.cfg.Configuration;  
  7.   
  8. public class HibernateUtils {  
  9.     public static SessionFactory sessionFactory;  
  10.     static{  
  11.         Configuration configuration = new Configuration();  
  12.         configuration.configure("cn/itcast/spring/sh/aop/hibernate.cfg.xml");  
  13.         sessionFactory = configuration.buildSessionFactory();  
  14. //      Session session = sessionFactory.openSession();  
  15. //      Transaction transaction = session.beginTransaction();  
  16. //      transaction.commit();  
  17.     }  
  18. }  

持久化類:Person

  1. package cn.itcast.spring.sh.aop;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. public class Person implements Serializable{  
  6.     private Long pid;  
  7.     private String pname;  
  8.     private String psex;  
  9.       
  10.     public Person(){}  
  11.       
  12.     public Person(String pname){  
  13.         this.pname = pname;  
  14.     }  
  15.       
  16.     public Long getPid() {  
  17.         return pid;  
  18.     }  
  19.     public void setPid(Long pid) {  
  20.         this.pid = pid;  
  21.     }  
  22.     public String getPname() {  
  23.         return pname;  
  24.     }  
  25.     public void setPname(String pname) {  
  26.         this.pname = pname;  
  27.     }  
  28.     public String getPsex() {  
  29.         return psex;  
  30.     }  
  31.     public void setPsex(String psex) {  
  32.         this.psex = psex;  
  33.     }  
  34.       
  35. }  

對映檔案:Person.hbm.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4.   
  5. <hibernate-mapping>  
  6.     <!--   
  7.         用來描述一個持久化類  
  8.         name  類的全名  
  9.         table 可以不寫  預設值和類名一樣   
  10.         catalog  資料庫的名稱  一般不寫  
  11.      -->  
  12.     <class name="cn.itcast.spring.sh.aop.Person">  
  13.         <!--   
  14.             標示屬性  和資料庫中的主鍵對應  
  15.             name  屬性的名稱  
  16.             column 列的名稱  
  17.          -->  
  18.         <id name="pid" column="pid" length="200" type="java.lang.Long">  
  19.             <!--   
  20.                 主鍵的產生器  
  21.                   就該告訴hibernate容器用什麼樣的方式產生主鍵  
  22.              -->  
  23.             <generator class="increment"></generator>  
  24.         </id>  
  25.         <!--  
  26.             描述一般屬性 
  27.          -->  
  28.         <property name="pname" column="pname" length="20" type="string"></property>  
  29.           
  30.         <property name="psex" column="psex" length="10" type="java.lang.String"></property>  
  31.     </class>  
  32. </hibernate-mapping>  

hibernate配置檔案:hibernate.cfg.xml

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">  
  4.   
  5. <hibernate-mapping>  
  6.     <!--   
  7.         用來描述一個持久化類  
  8.         name  類的全名  
  9.         table 可以不寫  預設值和類名一樣   
  10.         catalog  資料庫的名稱  一般不寫  
  11.      -->  
  12.     <class name="cn.itcast.spring.sh.aop.Person">  
  13.         <!--   
  14.             標示屬性  和資料庫中的主鍵對應  
  15.             name  屬性的名稱  
  16.             column 列的名稱  
  17.          -->  
  18.         <id name="pid" column="pid" length="200" type="java.lang.Long">  
  19.             <!--   
  20.                 主鍵的產生器  
  21.                   就該告訴hibernate容器用什麼樣的方式產生主鍵  
  22.              -->  
  23.             <generator class="increment"></generator>  
  24.         </id>  
  25.         <!--  
  26.             描述一般屬性 
  27.          -->  
  28.         <property name="pname" column="pname" length="20" type="string"></property>  
  29.           
  30.         <property name="psex" column="psex" length="10" type="java.lang.String"></property>  
  31.     </class>  
  32. </hibernate-mapping>  

目標介面:(這裡我們採用jdk的形式(實現介面))

  1. package cn.itcast.spring.sh.aop;  
  2.   
  3. public interface PersonDao {  
  4.     public String savePerson(Person person);  
  5. }  

目標類:

  1. package cn.itcast.spring.sh.aop;  
  2.   
  3.   
  4. import org.springframework.stereotype.Repository;  
  5.   
  6. @Repository("personDao1")  
  7. public class PersonDaoImpl extends HibernateUtils implements PersonDao  {  
  8.   
  9.     public String savePerson(Person person) {  
  10.         sessionFactory.getCurrentSession().save(person);  
  11.         System.out.println("執行儲存操作了。");  
  12.         return "返回值";  
  13.     }  
  14.       
  15.   
  16.   
  17. }  

切面類:

  1. package cn.itcast.spring.sh.aop;  
  2.   
  3. import org.aspectj.lang.JoinPoint;  
  4. import org.aspectj.lang.ProceedingJoinPoint;  
  5. import org.aspectj.lang.annotation.AfterReturning;  
  6. import org.aspectj.lang.annotation.Aspect;  
  7. import org.aspectj.lang.annotation.Before;  
  8. import org.aspectj.lang.annotation.Pointcut;  
  9. import org.hibernate.Transaction;  
  10. import org.springframework.stereotype.Component;  
  11.   
  12. /** 
  13.  * @Aspect 
  14.  * @author Administrator 
  15.  *  Aspect相當於<aop:config></aop:config> 
  16.  */  
  17. @Component("myTransaction")  
  18. @Aspect  
  19. public class MyTransaction extends HibernateUtils {  
  20.     private Transaction transaction;  
  21.       
  22.     /** 
  23.      * 通過一些引數可以獲取目標方法的相關資訊,報告目標方法名稱、返回值引數、異常資訊等 
  24.      * 不過相應的也要在配置檔案中進行設定(通過實驗,好像只配置後置及異常就可以只用了),不然就獲取不了。 
  25.      * 注:環繞通知不可以跟前置通知和後置通知一起用,因為環繞通知已經把兩個通知的東西做了,它可以呼叫目標方法 
  26.      *  
  27.      * */  
  28.       
  29.     //寫這個的目的就相當於早aop配置中寫了:  
  30.         //<aop:pointcut expression="execution(* cn.itcast.spring.sh.aop.PersonDaoImpl.*(..))" id="aa()"/>  
  31.     @Pointcut("execution(* cn.itcast.spring.sh.aop.PersonDaoImpl.*(..))")  
  32.     private void aa(){}//叫方法簽名:方法型別必須是void,修飾符最好是pivate  
  33.       
  34.       
  35.     //註解形式:前置通知  
  36.     @Before("aa()")  
  37.     public void beginTransaction(JoinPoint joinPoint){  
  38.         System.out.println("開啟事務");  
  39.         this.transaction = sessionFactory.getCurrentSession().beginTransaction();  
  40.           
  41.     }  
  42.       
  43.     //註解形式:後置通知  
  44.     @AfterReturning(value="aa()",returning="val")  
  45.     public void commit(Object val){  
  46.         //提交事務  
  47.         this.transaction.commit();  
  48.         System.out.println("關閉事務");  
  49.     }  
  50.       
  51. }  

applicationContext.xml配置檔案:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:aop="http://www.springframework.org/schema/aop"   
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  8.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  9.            http://www.springframework.org/schema/context  
  10.            http://www.springframework.org/schema/context/spring-context-2.5.xsd">  
  11.   
  12.   
  13. <!-- AOP註解講解 :將目標類和切面放入到spring容器管理,啟動掃描註解解析器  注:一般不用這個,因為有弊端-->  
  14.     <!--   
  15.         使用條件:  
  16.         AOP的條件如下  
  17.         xmlns:aop="http://www.springframework.org/schema/aop"   
  18.         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd"  
  19.           
  20.         掃描註解解析器的條件如下  
  21.         xmlns:context="http://www.springframework.org/schema/context"  
  22.         http://www.springframework.org/schema/context  
  23.         http://www.springframework.org/schema/context/spring-context-2.5.xsd"   
  24.     -->  
  25.      <context:component-scan base-package="cn.itcast.spring.sh.aop"></context:component-scan>  
  26.      <!-- 啟動aop的註解解析器 -->  
  27.      <aop:aspectj-autoproxy></aop:aspectj-autoproxy>  
  28. </beans>  

測試類:

  1. package cn.itcast.spring.sh.aop;  
  2.   
  3. import org.junit.Test;  
  4. import org.springframework.context.ApplicationContext;  
  5. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  6.   
  7. public class PersonTest {  
  8.     @Test  
  9.     public void test(){  
  10.         ApplicationContext applicationContext = new  ClassPathXmlApplicationContext("cn/itcast/spring/sh/aop/applicationContext.xml");  
  11.         PersonDao personDao = (PersonDao)applicationContext.getBean("personDao1");  
  12.         Person person1 = new Person();  
  13.         person1.setPname("李大鵬11");  
  14.         person1.setPsex("男");  
  15.         personDao.savePerson(person1);  
  16.     }   
  17. }  

結果:



總結:想對來說,不管是用xml的形式來實現,還是用註解的方式來實現,都可以。xml的形式有點兒是效率高,缺點是繁瑣

註解的缺點是效率低,優點是簡單。

相關文章