目录
Aspect oriented Programing面向切面编程,相比较oop 面向对象编程来说,Aop关注的不再是程序代码中某个类,某些方法,而aop考虑的更多的是一种面到面的切入,即层与层之间的一种切入,所以称之为切面。如:大家吃的汉堡(中间夹肉)。
AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面,实现公共功能性的重复使用。
动态代理(JDK与CGLIB)
被拦截到的每个点,spring中指被拦截到的每一个方法,spring aop一个连接点即代表一个方法的执行。
对连接点进行拦截的定义(匹配规则定义规定拦截哪些方法,对哪些方法进行处理),spring有专门的表达式语言定义。
拦截到每一个连接点即(每一个方法)后所要做的操作
切入点与通知的结合,决定了切面的定义,切入点定义了要拦截哪些类的哪些方法,通知则定义了拦截过方法后要做什么,切面则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。
被代理的对象
将切面应用到目标对象并生成代理对象的这个过程即为织入
在不修改原有应用程序代码的情况下,在程序运行期为类动态添加方法或者字段的过程称为引入
-
org.aspectj -
aspectjweaver -
1.9.6
- xmlns:aop="http://www.springframework.org/schema/aop"
-
- http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop.xsd
- package com.lsf.aspect;
-
-
-
- import org.aspectj.lang.annotation.*;
- import org.springframework.stereotype.Component;
-
- /**
- * 定义切面
- * 定义 切入点 与 通知 的结合
- *
- */
-
- @Component //将该类交给IOC实例化
- @Aspect //声明此类为切面类
- public class LogCut {
-
- /**
- * 定义切入点
- * 通过Pointcut定义规则
- * @Pointcut("execution(* com.lsf.service.*.*(..))") com.lsf.service下所有方法
- * 例:
- * 1,拦截所有方法
- * @Pointcut("execution(* *(..))")
- *
- * 2,拦截所有公共的set方法方法
- * @Pointcut("execution(public set*(..))")
- *
- *
- * *
- * *
- */
- @Pointcut("execution(* com.lsf.service.*.*(..))")
- public void cut(){
-
- }
- /**
- * 前置通知,引用在切入点
- * 在目标方法调用前
- */
-
-
- @Before(value = "cut()")
- public void before(){
- System.out.println("这是一个前面通知");
-
- }
-
- /**
- * 返回通知,引用在切入点
- * 在目标方法无异常返回时输出
- */
- @AfterReturning(value = "cut()")
- public void afterReturn(){
- System.out.println("返回通知");
- }
-
- /**
- * 最终通知,引用在切入点
- * 在目标方法是否异常 ,都输出
- */
- @After(value = "cut()")
- public void after(){
- System.out.println("最终通知");
- }
-
- /**
- * 异常通知,引用在切入点
- * 在目标方法发生异常时 ,都输出
- */
- @AfterThrowing(value = "cut()",throwing = "e")
- public void afterThrow(Exception e){
- System.out.println("异常通知:异常原因: ");
- }
-
- /**
- * 环绕通知,引用在切入点
- * 在目标方法发生异常时 ,都输出
- */
- @Around(value = "cut()")
- public Object around(){
- System.out.println("前置通知");
- Object result = null;
- try {
- System.out.println("返回通知");
-
- }catch (Exception e){
- e.printStackTrace();
- System.out.println("异常通知");
- }catch (Throwable throwable){
- throwable.printStackTrace();
- }finally {
- System.out.println("最终通知");
- }
-
- return result;
- }
-
-
- }
- package com.lsf;
-
-
- import com.lsf.service.UserService;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
- public class Starter {
-
- public static void main(String[] args) {
-
- ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
- UserService userService = (UserService) ac.getBean("userService");
- userService.test();
- }
-
-
-
- }
- package com.lsf.aspect;
-
- import org.aspectj.lang.annotation.*;
- import org.springframework.stereotype.Component;
-
- /**
- * 定义切面
- * 定义 切入点 与 通知 的结合
- *
- */
-
- @Component //将该类交给IOC实例化
- @Aspect //声明此类为切面类
- public class LogCutxml {
-
- /**
- * 定义切入点
- */
-
- public void cut(){
-
- }
- /**
- * 前置通知,引用在切入点
- * 在目标方法调用前
- */
-
-
-
- public void before(){
- System.out.println("这是一个前面通知");
-
- }
-
- /**
- * 返回通知,引用在切入点
- * 在目标方法无异常返回时输出
- */
-
- public void afterReturn(){
- System.out.println("返回通知");
- }
-
- /**
- * 最终通知,引用在切入点
- * 在目标方法是否异常 ,都输出
- */
-
- public void after(){
- System.out.println("最终通知");
- }
-
- /**
- * 异常通知,引用在切入点
- * 在目标方法发生异常时 ,都输出
- */
-
- public void afterThrow(Exception e){
- System.out.println("异常通知:异常原因: ");
- }
-
- /**
- * 环绕通知,引用在切入点
- * 在目标方法发生异常时 ,都输出
- */
-
- public Object around(){
- System.out.println("前置通知");
- Object result = null;
- try {
- System.out.println("返回通知");
-
- }catch (Exception e){
- e.printStackTrace();
- System.out.println("异常通知");
- }catch (Throwable throwable){
- throwable.printStackTrace();
- }finally {
- System.out.println("最终通知");
- }
-
- return result;
- }
-
-
- }
-
-
-
-
"logCutxml"> -
-
"cut" expression="execution(* com.lsf.service..*.*(..))"/> -
"before" pointcut-ref="cut" /> -
-
"afterReturn" pointcut-ref="cut"/> -
"afterThrow" throwing="e" pointcut-ref="cut" /> -
-
"after" pointcut-ref="cut" /> -
-
"around" pointcut-ref="cut"/> -
- package com.lsf;
-
-
- import com.lsf.service.UserService;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
- public class Starter {
-
- public static void main(String[] args) {
-
- ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
- UserService userService = (UserService) ac.getBean("userService");
- userService.test();
- }
-
-
-
- }