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

 

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

问题?Spring-Aop注解形式案例

我们知道,在spring中,spring提供了注解的形式,来达到对象的依赖注入。当然我们也可以直接用依赖注入将bean


这里写的是Spring-Aop注解形式案例

工具类:

[java]  view plain copy print ?
  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

[java]  view plain copy print ?
  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

[html]  view plain copy print ?
  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

[html]  view plain copy print ?
  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的形式(实现接口))

[java]  view plain copy print ?
  1. package cn.itcast.spring.sh.aop;  
  2.   
  3. public interface PersonDao {  
  4.     public String savePerson(Person person);  
  5. }  

目标类:

[cpp]  view plain copy print ?
  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. }  

切面类:

[java]  view plain copy print ?
  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配置文件:

[html]  view plain copy print ?
  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>  

测试类:

[java]  view plain copy print ?
  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的形式有点儿是效率高,缺点是繁琐

注解的缺点是效率低,优点是简单。

你可能感兴趣的:(注解,AOP,详解)