环绕增强MethodInterceptor接口

3.3.1增强类型

前置增强:org.springframework.aop.MethodBeforeAdvice

后置增强:org.springframework.aop.AfterReturningAdvice

环绕增强:org.aopalliance.intercept.MethodInterceptor

异常抛出增强:org.springframework.aop.ThrowsAdvice

引介增强:org.springframework.aop.support.DelegatingIntroductionInterceptor


3.3.2前置增强

就是在连接点方法执行之前执行的内容。
如:我们在UserDaoImpl的save()方法执行之前执行一些内容。

a、UserDaoUserDaoImpl:
[java]  view plain copy print ?
  1. public interface UserDao {    
  2.     public void save();    
  3. }    
[html]  view plain copy print ?
  1. public class UserDaoImpl implements UserDao {    
  2.     public void save() {    
  3.         System.out.println("保存用户...");    
  4.     }    
  5. }    

b、创建一个增强类实现 MethodBeforeAdvice接口
[java]  view plain copy print ?
  1. public class UserDaoBeforeAdvice implements MethodBeforeAdvice {  
  2.     public void before(Method method, Object[] args, Object object)  
  3.             throws Throwable {  
  4.         System.out.println("我是前置增强");  
  5.     }  
  6. }  


c、配置
[html]  view plain copy print ?
  1. <!-- 把增强类交由spring管理 -->  
  2.     <bean id="userDaoBeforeAdvice" class="cn.framelife.spring.advice.UserDaoBeforeAdvice"></bean>  
  3.   
  4.     <!-- 把目标类交由spring管理 -->  
  5.     <bean id="userDao" class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean>  
  6.   
  7.     <!--   
  8.         设置代理类   
  9.         p:target-ref 目标对象  
  10.         p:proxyInterfaces 代理所要实现的接口,也就是目标对象的接口  
  11.         p:interceptorNames 织入的增强Bean,可以是多个,用","号分开  
  12.     -->  
  13.     <bean id="adviceUserDao"   
  14.         class="org.springframework.aop.framework.ProxyFactoryBean"  
  15.         p:proxyInterfaces="cn.framelife.spring.dao.UserDao"  
  16.         p:interceptorNames="userDaoBeforeAdvice"  
  17.         p:target-ref="userDao"  
  18.      />  

d、main方法中测试
[java]  view plain copy print ?
  1. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});  
  2.         //通过代理来获取userDao对象  
  3.         UserDao userDao = (UserDao) context.getBean("adviceUserDao");  
  4.         userDao.save();  

f、结果
[plain]  view plain copy print ?
  1. 我是前置增强  
  2. 保存用户...  

3.3.3后置增强

就是在连接点方法执行之后执行的内容。

a、UserDaoUserDaoImpl:
[java]  view plain copy print ?
  1. public interface UserDao {    
  2.     public void save();    
  3. }    
[html]  view plain copy print ?
  1. public class UserDaoImpl implements UserDao {    
  2.     public void save() {    
  3.         System.out.println("保存用户...");    
  4.     }    
  5. }    

b、创建一个增强类实现 AfterReturningAdvice接口
[java]  view plain copy print ?
  1. public class UserDaoAfterAdvice implements AfterReturningAdvice {  
  2.     @Override  
  3.     public void afterReturning(Object object, Method method, Object[] args,  
  4.             Object arg3) throws Throwable {  
  5.         System.out.println("我是后置增强");  
  6.     }  
  7. }  



c、配置
[html]  view plain copy print ?
  1. <bean id="userDaoBeforeAdvice" class="cn.framelife.spring.advice.UserDaoBeforeAdvice"></bean>  
  2.     <bean id="userDaoAfterAdvice" class="cn.framelife.spring.advice.UserDaoAfterAdvice"></bean>  
  3.   
  4.     <bean id="userDao" class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean>  
  5.   
  6.       
  7.     <bean id="adviceUserDao"   
  8.         class="org.springframework.aop.framework.ProxyFactoryBean"  
  9.         p:proxyInterfaces="cn.framelife.spring.dao.UserDao"  
  10.         p:interceptorNames="userDaoBeforeAdvice,userDaoAfterAdvice"  
  11.         p:target-ref="userDao"  
  12.      />  


d、main方法中测试
[java]  view plain copy print ?
  1. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});  
  2.         //通过代理来获取userDao对象  
  3.         UserDao userDao = (UserDao) context.getBean("adviceUserDao");  
  4.         userDao.save();  

f、结果
[plain]  view plain copy print ?
  1. 保存用户...  
  2. 我是后置增强  


3.3.4环绕增强

环绕增强与struts2AOP类似。



a、UserDaoUserDaoImpl:
[java]  view plain copy print ?
  1. public interface UserDao {    
  2.     public void save();    
  3. }    
[html]  view plain copy print ?
  1. public class UserDaoImpl implements UserDao {    
  2.     public void save() {    
  3.         System.out.println("保存用户...");    
  4.     }    
  5. }    

b、创建一个增强类实现 MethodInterceptor接口
[java]  view plain copy print ?
  1. public class UserDaoSurroundAdvice implements MethodInterceptor {  
  2.   
  3.     @Override  
  4.     public Object invoke(MethodInvocation invocation) throws Throwable {  
  5.         System.out.println("环绕增强在方法前执行...");  
  6.         Object object = invocation.proceed();  
  7.         System.out.println("环绕增强在方法后执行...");  
  8.         return object;  
  9.     }  
  10.   
  11. }  


c、配置
[java]  view plain copy print ?
  1. <bean id="userDaoSurroundAdvice" class="cn.framelife.spring.advice.UserDaoSurroundAdvice"></bean>  
  2.       
  3.     <bean id="userDao" class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean>  
  4.   
  5.     <bean id="adviceUserDao"   
  6.         class="org.springframework.aop.framework.ProxyFactoryBean"  
  7.         p:proxyInterfaces="cn.framelife.spring.dao.UserDao"  
  8.         p:interceptorNames=" userDaoSurroundAdvice"  
  9.         p:target-ref="userDao"  
  10.      />  



d、main方法中测试
[java]  view plain copy print ?
  1. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});  
  2.         //通过代理来获取userDao对象  
  3.         UserDao userDao = (UserDao) context.getBean("adviceUserDao");  
  4.         userDao.save();  

f、结果
[plain]  view plain copy print ?
  1. 环绕增强在方法前执行...  
  2. 保存用户...  
  3. 环绕增强在方法后执行...  


3.3.5异常抛出增强

就是在方法出现异常之后执行的代码。



a、UserDaoUserDaoImpl:
[java]  view plain copy print ?
  1. public interface UserDao {    
  2.     public void save();    
  3. }    
[java]  view plain copy print ?
  1. public class UserDaoImpl implements UserDao {      
  2.      public void save() {      
  3.          System.out.println("保存用户...");      
  4.          //使方法在运行的时候抛出一个异常  
  5.           throw new RuntimeException("运行时异常...");  
  6.   
  7.     }      
  8. }    


b、创建一个增强类实现 ThrowsAdvice接口
[java]  view plain copy print ?
  1. public class UserDaoThrowsAdvice implements ThrowsAdvice {  
  2.     public void afterThrowing(Method method,Object[] args,Object taglet,Exception ex)throws Throwable{  
  3.         System.out.println("我是异常抛出接口");  
  4.         System.out.println(method.getName());  
  5.         System.out.println(ex.getMessage());  
  6.     }  
  7. }  



c、配置
[html]  view plain copy print ?
  1. <bean id="userDaoThrowAdvice" class="cn.framelife.spring.advice.UserDaoThrowsAdvice"></bean>  
  2.   
  3. <!--  
  4.      p:proxyTargetClass="false"  
  5.     如果目标对象是一个类,而不是一个接口,我们设置为true  
  6. -->  
  7.     <bean id="userDao" class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean>  
  8.   
  9.     <bean id="adviceUserDao"   
  10.         class="org.springframework.aop.framework.ProxyFactoryBean"  
  11.         p:proxyInterfaces="cn.framelife.spring.dao.UserDao"  
  12.         p:interceptorNames="userDaoThrowAdvice"  
  13.         p:target-ref="userDao"  
  14.         p:proxyTargetClass="false"  
  15.      />  




d、main方法中测试
[java]  view plain copy print ?
  1. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});  
  2.         //通过代理来获取userDao对象  
  3.         UserDao userDao = (UserDao) context.getBean("adviceUserDao");  
  4.         userDao.save();  

f、结果
[plain]  view plain copy print ?
  1. 保存用户...  
  2. Exception in thread "main" java.lang.RuntimeException: 运行时异常...  
  3.     at cn.framelife.spring.dao.impl.UserDaoImpl.save(UserDaoImpl.java:12)  
  4.     at cn.framelife.spring.dao.impl.UserDaoImpl$$FastClassByCGLIB$$18bd6dee.invoke(<generated>)  
  5.     at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191)  
  6.     at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:688)  
  7.     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)  
  8.     at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:124)我是异常抛出接口  
  9. save  
  10. 运行时异常...  
  11.   
  12.     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)  
  13.     at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:621)  
  14.     at cn.framelife.spring.dao.impl.UserDaoImpl$$EnhancerByCGLIB$$5bbe38b0.save(<generated>)  
  15.     at cn.framelife.spring.test.Test.main(Test.java:17)  


3.3.6引介增强

     引介增强是为目标类创建新的方法和属性,引介增强的连接点是类级别的,不是方法级别的。通过引介增强,我们可以为目标类添加一个接口的实现,即原来目标类未实现某个接口,通过引介增强可以为目标类创建实现某个接口的代理。




a、UserDaoUserDaoImpl:
[java]  view plain copy print ?
  1. public interface UserDao {    
  2.     public void save();    
  3. }    
[html]  view plain copy print ?
  1. public class UserDaoImpl implements UserDao {    
  2.     public void save() {    
  3.         System.out.println("保存用户...");    
  4.     }    
  5. }    


b、新建一个接口 AInterface
[java]  view plain copy print ?
  1. public interface AInterface {  
  2.     public void say();  
  3. }  



c、增强类继承 DelegatingIntroductionInterceptor实现 AInterface
[java]  view plain copy print ?
  1. public class IntroductionAdvice extends DelegatingIntroductionInterceptor implements AInterface {  
  2.     /* 
  3.      * 实现AInterface中的方法 
  4.      */  
  5.     public void say() {  
  6.         System.out.println("UserDao要说话");  
  7.     }  
  8.   
  9.     /* 
  10.      * 重写DelegatingIntroductionInterceptor的invoke方法 
  11.      */  
  12.     public Object invoke(MethodInvocation mi) throws Throwable {  
  13.         System.out.println("方法执行前执行");  
  14.         System.out.println(mi.getClass().getName());  
  15.         System.out.println(mi.getMethod().getName());  
  16.         Object object = super.invoke(mi);  
  17.         System.out.println("方法执行后执行");  
  18.         return object;  
  19.     }     
  20. }  




d、配置

[html]  view plain copy print ?
  1. <bean id="userDao" class="cn.framelife.spring.dao.impl.UserDaoImpl"></bean>  
  2.   
  3.     <bean id="introductionAdvice" class="cn.framelife.spring.advice.IntroductionAdvice"></bean>  
  4.     <!--   
  5.         代理类设置  
  6.         p:proxyTargetClass="true" 引介增强一定要通过创建子类来生成代理,所以要设置为true。  
  7.             也不需要配置p:proxyInterfaces目标类的接口  
  8.         p:interfaces 引介增强所实现的接口  
  9.      -->  
  10.     <bean id="aProxy"   
  11.         class="org.springframework.aop.framework.ProxyFactoryBean"  
  12.         p:interfaces="cn.framelife.spring.dao.AInterface"   
  13.         p:interceptorNames="introductionAdvice"  
  14.         p:target-ref="userDao"   
  15.         p:proxyTargetClass="true" />  

e、main方法中测试
[java]  view plain copy print ?
  1. ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"});  
  2.         UserDao userDao = (UserDao) context.getBean("aProxy");  
  3.         userDao.save();  
  4.           
  5.         System.out.println("-------------");  
  6.           
  7.         AInterface a = (AInterface)userDao;  
  8.         a.say();  
  9.           
  10.         System.out.println("-------------");  
  11.         userDao.save();  


f、结果
[java]  view plain copy print ?
  1. 方法执行前执行  
  2. org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation  
  3. save  
  4. 保存用户...  
  5. 方法执行后执行  
  6. -------------  
  7. 方法执行前执行  
  8. org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation  
  9. say  
  10. UserDao要说话  
  11. 方法执行后执行  
  12. -------------  
  13. 方法执行前执行  
  14. org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation  
  15. save  
  16. 保存用户...  
  17. 方法执行后执行  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值