spring AOP原理

 

Spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的。
以下是JDK动态代理和CGLIB代理简单介绍
    JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
    CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强。  

 

1)定义接口:

 

  1. package com.beckham.dao;  
  2. import com.beckham.model.Person;  
  3. public interface PersonDAO {  
  4.     public void add(Person person) ;  
  5. }  

 

2)实现接口:

 

  1. package com.beckham.daoimp;  
  2. import com.beckham.dao.PersonDAO;  
  3. import com.beckham.model.Person;  
  4. public class PersonDAOImp implements PersonDAO {  
  5.     public void add(Person person) {  
  6.         System.out.println(person.getName());  
  7.     }  
  8. }  
 

 

3)服务层:

 

  1. package com.beckham.service;  
  2. import com.beckham.dao.PersonDAO;  
  3. import com.beckham.model.Person;  
  4. public class PersonService {  
  5.     //注入personDAO   
  6.     private PersonDAO personDAO ;  
  7.       
  8.     public PersonDAO getPersonDAO() {  
  9.         return personDAO;  
  10.     }  
  11.     public void setPersonDAO(PersonDAO personDAO) {  
  12.         this.personDAO = personDAO;  
  13.     }  
  14.     //调用personDAOImp里面的方法   
  15.     public void add(Person person) {  
  16.         personDAO.add(person) ;  
  17.     }  
  18. }  
 

 

4)切面类:

 

  1. package com.beckham.aop;  
  2. public class LogHandler {  
  3.     public void before(){  
  4.         System.out.println("方法开始.......");  
  5.     }  
  6.     public void after(){  
  7.         System.out.println("方法结束.......");  
  8.     }  
  9. }  
 

 

5)XML配置切面

 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!--  
  3.     Application context definition for PetClinic on JPA.  
  4. -->  
  5. <beans xmlns="http://www.springframework.org/schema/beans"  
  6.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  7.     xmlns:p="http://www.springframework.org/schema/p"  
  8.     xmlns:aop="http://www.springframework.org/schema/aop"  
  9.     xmlns:context="http://www.springframework.org/schema/context"  
  10.     xmlns:jee="http://www.springframework.org/schema/jee"  
  11.     xmlns:tx="http://www.springframework.org/schema/tx"  
  12.     xsi:schemaLocation="  
  13.             http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd   
  14.             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  15.             http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd   
  16.             http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd   
  17.             http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">   
  18.     <bean id="person" class="com.beckham.model.Person"  
  19.         scope="prototype" />  
  20.     <bean id="personDAO" class="com.beckham.daoimp.PersonDAOImp" />  
  21.     <bean id="personService"  
  22.         class="com.beckham.service.PersonService">  
  23.         <property name="personDAO" ref="personDAO"></property>  
  24.     </bean>  
  25.     <bean id="user" class="com.beckham.model.User" />  
  26.     <bean id="userDAO" class="com.beckham.daoimp.UserDAOImp" />  
  27.     <bean id="userServiceInterfaceImpl"  
  28.         class="com.beckham.service.UserServiceInterfaceImpl">  
  29.         <property name="userDAO" ref="userDAO"></property>  
  30.     </bean>  
  31.   
  32.     <!-- AOP配置 -->  
  33.     <bean id="loghandler" class="com.beckham.aop.LogHandler" />  
  34.     <aop:config>  
  35.         <!-- 配置切入点 -->  
  36.         <aop:pointcut id="logCut"  
  37.             expression="execution(* com.beckham.daoimp.PersonDAOImp.*(..))" />  
  38.         <!-- 引用该切面类 -->  
  39.         <aop:aspect id="aspect" ref="loghandler">  
  40.             <aop:before method="before" pointcut-ref="logCut" />  
  41.             <aop:after method="after" pointcut-ref="logCut" />  
  42.         </aop:aspect>  
  43.     </aop:config>  
  44.     <!-- AOP配置 -->  
  45.     <bean id="timehandler" class="com.beckham.aop.TimeHandler" />  
  46.     <aop:config>  
  47.         <!-- 配置切入点 -->  
  48.         <aop:pointcut id="timeCut"  
  49.             expression="execution(* com.beckham.daoimp..*(..))" />  
  50.         <!-- 引用该切面类 -->  
  51.         <aop:aspect id="timAspect" ref="timehandler">  
  52.             <aop:before method="before" pointcut-ref="timeCut" />  
  53.             <aop:after method="after" pointcut-ref="timeCut" />  
  54.         </aop:aspect>  
  55.     </aop:config>  
  56.   
  57. </beans>  
 

 

6)测试:

 

  1. package com.test;  
  2. import org.springframework.context.ApplicationContext;  
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4. import com.beckham.model.Person;  
  5. import com.beckham.model.User;  
  6. import com.beckham.service.PersonService;  
  7. import com.beckham.service.UserServiceInterface;  
  8. public class SpringTest {  
  9.     /** 
  10.      * beckham Dec 28, 2009 1:21:09 PM 
  11.      */  
  12.     public static void main(String[] args) {  
  13.         personManager();  
  14.     }  
  15.     public static void personManager() {  
  16.         ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  17.                 "applicationContext.xml");  
  18.         Person p = (Person) ctx.getBean("person");  
  19.         p.setName("张三");  
  20.         PersonService ps = (PersonService) ctx.getBean("personService");  
  21.         ps.add(p);  
  22.     }  
  23.     public static void userManager() {  
  24.         ApplicationContext ctx = new ClassPathXmlApplicationContext(  
  25.                 "applicationContext.xml");  
  26.         User u = (User) ctx.getBean("user");  
  27.         u.setName("张三");  
  28.         UserServiceInterface ps = (UserServiceInterface) ctx.getBean("userServiceInterfaceImpl");  
  29.         ps.sayHello(u.getName());  
  30.     }  
  31. }  
 

 

测试结果:

 

方法开始.......

1262678458703

张三

1262678458703

方法结束.......

 

如果想用注解方式进行的话,可以参考下面的地址:http://wenku.baidu.com/view/47b407ef6294dd88d0d26b6e.html

 

转自:http://blog.youkuaiyun.com/gaowenming/article/details/5136333

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值