AOP:是面向切面编程,将分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中。
Joinpoint:类中可以被增强的方法,这些方法称为连接点。
Pointcut:我们要进行增强的方法,对连接点进行拦截的定义
Advice(通知/增强):指拦截到joinpoint后所要做的是就是通知,分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面所完成的功能)
Aspect(切面):切入点和通知的结合;
Target:被通知的对象,也是连接点所在的对象
Proxy: 向目标对象应用通知之后创建的对象
先创建一个类,将其中的prin()方法作为切入点,Book类就是目标对象
public class Book {
public void prin(){
System.out.println("切入点");
}
}
再创建一个类,作为切面
public class Mybook {
public void be_enhance(){
System.out.println("前置增强");
}
public void af_enhance(){
System.out.println("后置增强");
}
public void ar_enhance(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("方法前环绕");
joinPoint.proceed();
System.out.println("方法后环绕");
}
}
在xml创建对象实例
<bean id="book" class="aop_aspecj.Book"></bean>
<bean id="mybook" class="aop_aspecj.Mybook"></bean>
并对方法进行增强
<aop:config>
<!--配置切入点 -->
<aop:pointcut expression="execution(* aop_aspecj.Book.*(..))" id="pointcut1"/>
<!-- 配置切面:增强用在具体方法(切入点)上 -->
<aop:aspect ref="mybook">
<aop:before method="be_enhance" pointcut-ref="pointcut1"/>
<aop:after-returning method="af_enhance" pointcut-ref="pointcut1"/>
<aop:around method="ar_enhance" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
运行效果:
前置增强
方法前环绕
切入点
后置增强
方法后环绕
aop注解
aop一般通过注解方式来配置,更加简单快捷,我们还是通过上面的例子来演示。
先配置xml,创建对象并设置代理;
<!-- 开启aop代理 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- 创建对象 -->
<bean id="book" class="aop_aspecj.Book"></bean>
<bean id="mybook" class="aop_aspecj.Mybook"></bean>
再在增强类中注解,配置切入点及增强方式
@Aspect
public class MyBook {
@Before(value="execution(* aop_aspecj.Book.*(..))")
public void be_enhance(){
System.out.println("前置增强");
}
}
然后咱们就可以通过测试类运行 效果是前置增强。