AOP:面向切面编程,AOP是OOP(面向对象)的拓展和延伸。
1.Spring底层的AOP实现原理
动态代理
JDK动态代理: 只能对实现了接口的类产生代理。
Cglib动态代理:可以对没有实现接口的对象产生代理,生成子类。
Spring在你实现了接口的类,会使用JDK代理,没有实现使用Cglib代理,自动更换
2.Spring的AOP的开发入门(XML文件配置)
1.建项目,导包。
2.在src下新建applicationContext.xml配置文件,并引入约束
//applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
</beans>
3.编写测试类,并做相应的配置
4.测试,这里使用Spring和JUnit的整合进行测试。需要导入spring-test-4.2.4.RELEASE.jar包
3.Spring的AOP开发的通知类型
1.前置通知:在切点之前执行,可以获得切点信息
2.后置通知:可以获得切点的返回值
3.环绕通知:环绕通知可以控制切点函数是否执行
4.异常通知
当有异常发生是执行的通知,使用<aop:after-throwing method=""/>配置切面,可获得异常信息,切面函数的参数名必须和xml中的throwing相同
5.最终通知
和代码中的finally块相似,切点执行完毕后最终执行的通知,使用<aop:after method=""/>配置
4.Spring切入点表达式的写法
语法:[访问修饰符] 方法返回值 包名.类名.方法名(参数),,,,访问修饰符可以不要,是基于execution函数完成的,返回值,包名,类名等全都可以用*表示(代表任意)
5.Spring的AOP的注解的入门
使用注解实现AOP开发所需的包和使用XML实现是一样的,操作也差不多,把目标类和切面类交给Spring管理,只是切点的定义是通过加注解实现的,以及在xml文件中配置<aop:aspectj-autoproxy/>开启AOP注解的使用。
AOP注解开发的通知类型
1.@Before(value="") :前置通知
2.@AfterReturning(value="",returning=""):后置通知,returning表示返回值。用法和xml中一样
3.@Around(value=""):环绕通知,切面方法也需要一个ProceedingJoinPoint类型的参数
4.@AfterThrowing(value="",throwing=""):参数throwing的用法和xml中的一样
5.@After(value=""):最终通知,无论是否有异常都会执行。