文章目录
AOP面向切面【Aspect Oriented Programming】
1.代理设计模式
将程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们已有方法进行增强
2.Java 2中动态代理模式
1.JDK动态代理机制
必须有接口
2.CJGLIB动态代理机制
可以没有接口
3.AOP的作用及优势
作用:在程序运行期间,不修改源码对已有方法进行增强。
优势:减少重复代码、提高开发效率、维护方便
4.面向切面编程【注解版本】
1、导入切面相关联坐标【pom.xml中】
<!--AOP切面坐标-->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
2、在配置文件中追加切面的命名空间【beans.xml中】
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:bean="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">
3、开启自动代理【beans.xml中】
<!--开启切面自动扫描-->
<aop:aspectj-autoproxy ></aop:aspectj-autoproxy>
4、切面类写注解【@Component和@Aspect】
@Aspect
@Component
public class MyAop {
@Before(value = "execution(* com.zx.service.impl.UserServiceImpl.testAop(..))")
public void before(){
System.out.println("before");
}
@After(value = "execution( * com.zx.service.impl.UserServiceImpl.testAop(..))")
public void after(){
System.out.println("after");
}
@Around(value = "execution( * com.zx.service.impl.UserServiceImpl.testAop(..))")
public void around(ProceedingJoinPoint p ) throws Throwable {
System.out.println("环绕通知.前");
p.proceed();
System.out.println("环绕通知.后");
}
@AfterReturning(value = "execution( void com.zx.service.impl.UserServiceImpl.testAop(..))")
public void afterReturning(){
System.out.println("afterReturning");
}
@AfterThrowing(value = "execution( void com.zx.service.impl.UserServiceImpl.testAop(..))")
public void afterThrowing(){
System.out.println("afterThrowing");
}
}
5.通知类型:
i. 前置通知:@Before:
1) 应用:各种校验
2) 其它:在方法执行前执行,该方法中出现了异常,不会影响前置统治的执行
ii. 后置通知:@After
1) 应用:清理现场
2) 其它:方法执行完毕后执行,无论方法中是否出现异常都会执行
iii. 最终通知:@AfterRetuening
1) 应用:常规数据处理
2) 其它:方法正常返回后执行,无论方法中是否出现异常都会执行
iv. 抛异常通知:@AfterThrowing
1) 应用:包装异常信息
2) 其它:方法抛出异常后执行,如果方法没有抛出异常,无法执行
v. 环绕通知:@Around
1) 应用:十分强大,可以做任何事情
2) 其它:方法执行前后分别执行,如果方法中有异常,末尾通知就不执行了
6.切入点表达式:
i. 语法:通知类型(“execution(切入的方法)”)
ii. 访问修饰符:一般是public
iii. 返回值:void int String User
通配符: * ,匹配所有返回值
iv. 包名:一般情况下切入到接口包即可
.. 接口包以及子包
. 接口包
v. 方法名称:类的全限定类名.方法名称
vi. 参数:(int) (java.lang.String)
(*)一个任意类型的参数
(*,*)两个任意类型的参数
(. .)人一个属任意类型的参数
h. 【注意事项】public可以省略!
5.面向切面编程【注解版本】
在beans.xml中添加,
头声明文件同上
<!--XML版本的AOP配置-->
<!--声明切面类-->
<bean id="myop_xml" class="com.zx.aop.MyAop"></bean>
<!--配置AOP切面相关内容-->
<aop:config>
<aop:aspect id="aspect" ref="myop_xml">
<aop:pointcut id="pointcut" expression="execution(* com.zx.service.impl.UserServiceImpl.testAop(..))"></aop:pointcut>
<aop:before method="before" pointcut-ref="pointcut"></aop:before>
<aop:after method="after" pointcut-ref="pointcut"></aop:after>
</aop:aspect>
</aop:config>