AOP概念
1.aop:面向切面编程,扩展功能不修改源代码实现
2.采用的是横向抽取机制
AOP原理
底层使用的是动态代理实现
1. 有接口的情况(JDK动态代理)
使用动态代理方式,创建接口实现类代理对象
创建和DaoImpl类平级对象,不是真正对象,代理对象,实现和DaoImpl相同的功能
2.没有接口情况 (cglib动态代理)
创建User类的子类的代理对象
在子类中调用父类的方法完成
AOP中相关的术语
*连接点:类里面的哪些方法可以被增强,这些方法被称为 Joinpoint(连接点)
*切入点:在类里可以有很多方法被增强,而真正增强的方法称为Pointcut(切入点)
*通知/增强:增强的逻辑,称为增强。
前置通知:在方法之前执行
后置通知:在方法之后执行
异常通知:方法出现异常
最终通知:在后置之后执行
环绕通知:在之前和之后执行
*切面:把增强应用到具体的方法上面,过程称为Aspect(切面)。
把增强用到切入点的过程
Spring的aop操作
1.在spring里进行aop操作,使用aspectj实现
2.使用aspectj实现aop有两种方式
(1)基于aspectj的xml配置
(2)基于aspectj的注解方式
Aop操作准备
1.导入jar包
aopalliance
aspectjweaver
spring-aop-4.2.4RELEASE.jar
spring-aspects-4.2.4RELEASE.jar
2.创建spring核心的配置文件
xml中配置aop约束
使用表达式配置切入点
1.切入点:实际增强的方法
2.常用的表达式
(1)execution(* (增强方法的全路径))
(2)execution(* (增强类的全路径).*)
(3)execution(* *.*(..))
aspectj的aop操作
(xml)
<bean id="book" class=""></bean>
<bean id="mybook" class=""></bean>
<aop:config>
配置切入点
<aop:pointcut expression="execution(* Book.*(...))" id="pointcut1"/>
配置切面
<aop:aspect ref="mybook">
配置增强类型
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
<aop:around method="around1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
注:环绕通知
public void around1(ProceedingJoinPoint ProceedingJoinPoint) throws Throwable{
System.out.println("方法之前....")
proceedingJoinPoint.proceed();
System.out.println("方法之后....")
1.aop:面向切面编程,扩展功能不修改源代码实现
2.采用的是横向抽取机制
AOP原理
底层使用的是动态代理实现
1. 有接口的情况(JDK动态代理)
使用动态代理方式,创建接口实现类代理对象
创建和DaoImpl类平级对象,不是真正对象,代理对象,实现和DaoImpl相同的功能
2.没有接口情况 (cglib动态代理)
创建User类的子类的代理对象
在子类中调用父类的方法完成
AOP中相关的术语
*连接点:类里面的哪些方法可以被增强,这些方法被称为 Joinpoint(连接点)
*切入点:在类里可以有很多方法被增强,而真正增强的方法称为Pointcut(切入点)
*通知/增强:增强的逻辑,称为增强。
前置通知:在方法之前执行
后置通知:在方法之后执行
异常通知:方法出现异常
最终通知:在后置之后执行
环绕通知:在之前和之后执行
*切面:把增强应用到具体的方法上面,过程称为Aspect(切面)。
把增强用到切入点的过程
Spring的aop操作
1.在spring里进行aop操作,使用aspectj实现
2.使用aspectj实现aop有两种方式
(1)基于aspectj的xml配置
(2)基于aspectj的注解方式
Aop操作准备
1.导入jar包
aopalliance
aspectjweaver
spring-aop-4.2.4RELEASE.jar
spring-aspects-4.2.4RELEASE.jar
2.创建spring核心的配置文件
xml中配置aop约束
使用表达式配置切入点
1.切入点:实际增强的方法
2.常用的表达式
(1)execution(* (增强方法的全路径))
(2)execution(* (增强类的全路径).*)
(3)execution(* *.*(..))
aspectj的aop操作
(xml)
<bean id="book" class=""></bean>
<bean id="mybook" class=""></bean>
<aop:config>
配置切入点
<aop:pointcut expression="execution(* Book.*(...))" id="pointcut1"/>
配置切面
<aop:aspect ref="mybook">
配置增强类型
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
<aop:around method="around1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
注:环绕通知
public void around1(ProceedingJoinPoint ProceedingJoinPoint) throws Throwable{
System.out.println("方法之前....")
proceedingJoinPoint.proceed();
System.out.println("方法之后....")
}
基于aspectj的注解aop
1.使用注解方式实现aop操作
第一步 创建对象
第二步 在spring的核心文件中开启aop的操作
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<bean id="" class=""></bean>
第三步:在增强类上使用注解实现aop操作
1.在增强类上添加 @Aspect
2.@Before 实例 @Before(value="execution(* Book.*(...))")
@AfterReturning
@Around
@AfterThrowing
@After