Spring中的四种增强有那四种?
前置增强 后置增强 环绕增强 异常增强
先编写接口和实体类 ISomeService和SomeServiceImpl
package demo10;/** * Created by mycom on 2018/3/8. */public interface ISomeService { public void doSome();}
package demo10;/** * Created by mycom on 2018/3/8. */public class SomeServiceImpl implements ISomeService { public void doSome() { System.out.println("================="); }}
先来说第一个前置增强,直接用例子来说明
package demo10;import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;/** * Created by mycom on 2018/3/8. */public class BeforeAdvice implements MethodBeforeAdvice { public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println("=========before"); }}
在配置文件中
@Test public void t1(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextBefore.xml"); ISomeService proxyService =(ISomeService) context.getBean("proxyService"); proxyService.doSome(); }
运行的结果是
2.后置增强和前置增强一样,只是改一改配置文件里的名称就可以
3.环绕增强
直接饮用上面的接口和实现类了
在创建另一个类 MethodAdvice
package demo12;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;/** * Created by mycom on 2018/3/8. */public class MethodAdvice implements MethodInterceptor { public Object invoke(MethodInvocation methodInvocation) throws Throwable { System.out.println("前置增强"); Object result = methodInvocation.proceed(); System.out.println("后置增强"); return result; }}
4.异常增强
package demo13;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;import org.springframework.aop.ThrowsAdvice;/** * Created by mycom on 2018/3/8. */public class MyThroesAdvice implements ThrowsAdvice { public void afterThrowing(Exception ex){ System.out.println("网络出现错误"); }}
@Test public void t2(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextThrows.xml"); ISomeService proxyService =(ISomeService) context.getBean("proxyService"); try{ proxyService.doSome(); }catch (Exception ex){ ex.printStackTrace(); }
5.advisor 是顾问的意思 正对某一个方法增强
还有一个词是通知 advice 我自己的理解是 通知视同只所有人,顾问是针对某个人顾问,这样方便记忆,顾问包括通知
通知的方法有两种名称匹配方法切入点顾问和正则方法切入点顾问
先看第一种:
现在在ISomeService接口中在添加一个方法doAny(),在实现类中重写这个方法
那么在配置文件中
这个配置文件可以对比着之前写的配置文件看看有什么不同之处
@Test public void t2(){ ApplicationContext context=new ClassPathXmlApplicationContext("applicationContextAdvisor.xml"); ISomeService proxyService =(ISomeService) context.getBean("proxyService"); proxyService.doSome(); proxyService.doAny(); }
第二种方法:正则方法切入点顾问
同样是饮用上面的接口和实现类,在配置文件中:
这个节点中name还有一个值是:patterns,其value值是:
这种方法用的是正则的符号