AOP:【动态代理】||@Pointcut
AOP:【动态代理】 * 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;
* 1、导入aop模块;Spring AOP:(spring-aspects)
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>* 2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)
* 3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;
* 通知方法:
* 前置通知(@Before):logStart:在目标方法(div)运行之前运行
* 后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束)
* 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行
* 异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行
* 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.proceed())
* 4、给切面类的目标方法标注何时何地运行(通知注解);
* 5、将切面类和业务逻辑类(目标方法所在类)都加入到容器中;
* 6、必须告诉Spring哪个类是切面类(给切面类上加一个注解:@Aspect )
* 7、给配置类中加 @EnableAspectJAutoProxy 【开启基于注解的aop模式】
* 在Spring中很多的 @EnableXXX;
* 三步: * 1)、将业务逻辑组件和切面类都加入到容器中;告诉Spring哪个是切面类(@Aspect) * 2)、在切面类上的每一个通知方法上标注通知注解,告诉Spring何时何地运行(切入点表达式) * 3)、开启基于注解的aop模式;@EnableAspectJAutoProxy
MathCalculator.java
package com.dym.aop;public class MathCalculator {public int div(int i,int j){System.out.println("MathCalculator...div...");return i/j; }}
LogAspects.java
package com.dym.aop;import java.util.Arrays;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;/*** @Aspect: 告诉Spring当前类是一个切面类*/
@Aspect
public class LogAspects {//抽取公共的切入点表达式//1、本类引用//2、其他的切面引用@Pointcut("execution(public int com.dym.aop.MathCalculator.*(..))")public void pointCut() {};//@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)@Before("pointCut()")public void logStart(JoinPoint joinPoint) {Object[] args = joinPoint.getArgs();System.out.println("" + joinPoint.getSignature().getName() + "运行。。。@Before:参数列表是:{" + Arrays.asList(args) + "}");}@After("com.dym.aop.LogAspects.pointCut()")public void logEnd(JoinPoint joinPoint) {System.out.println("" + joinPoint.getSignature().getName() + "结束。。。@After");}//JoinPoint一定要出现在参数表的第一位@AfterReturning(value = "pointCut()", returning = "result")public void logReturn(JoinPoint joinPoint, Object result) {System.out.println("" + joinPoint.getSignature().getName() + "正常返回。。。@AfterReturning:运行结果:{" + result + "}");}@AfterThrowing(value = "pointCut()", throwing = "exception")public void logException(JoinPoint joinPoint, Exception exception) {System.out.println("" + joinPoint.getSignature().getName() + "异常。。。异常信息:{" + exception + "}");}}
MainConfigOfAOP.java
package com.dym.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;import com.dym.aop.LogAspects;
import com.dym.aop.MathCalculator;@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {//业务逻辑类加入容器中@Beanpublic MathCalculator calculator(){return new MathCalculator();}//切面类加入到容器中@Beanpublic LogAspects logAspects(){return new LogAspects();}
}
IOCTest_AOP.java
package com.dym.test;import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.dym.aop.MathCalculator;
import com.dym.config.MainConfigOfAOP;public class IOCTest_AOP {@Testpublic void test01(){AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);//1、不要自己创建对象
// MathCalculator mathCalculator = new MathCalculator();
// mathCalculator.div(1, 1);MathCalculator mathCalculator = applicationContext.getBean(MathCalculator.class);mathCalculator.div(1, 1);applicationContext.close();}}
AOP:【动态代理】||@Pointcut相关推荐
- AOP动态代理的实现机制
2019独角兽企业重金招聘Python工程师标准>>> 1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP. 在编译器修改源代码,在运行期字节码加载前修改字 ...
- Spring AOP源码解析——AOP动态代理原理和实现方式
2019独角兽企业重金招聘Python工程师标准>>> Spring介绍 Spring(http://spring.io/)是一个轻量级的Java 开发框架,同时也是轻量级的IoC和 ...
- Spring AOP动态代理
导入依赖: <dependency><groupId>org.springframework</groupId><artifactId>spring-a ...
- spring中AOP动态代理的两种方式
AOP动态代理的两种方式 Spring AOP动态代理的方式(spring的AOP默认是JDK Proxy) 浅谈这两种动态代理 JDK的动态代理,需要有实现接口 动态代理--JDK Proxy ⚫ ...
- Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题
Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题 参考文章: (1)Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代 ...
- AOP||动态代理||AOP专业术语;
AOP:(Aspect Oriented Programming)面向切面编程: OOP:(Object Oriented Programming )面向对象编程: 面向切面编程:基于OOP基础之上新 ...
- Aop动态代理解决问题
使用动态代理解决上述问题 代理设计模式的原理: 使用一个代理将对象包装起来, 然后用该代理对象取代原始对象. 任何对原始对象的调用都要通过代理. 代理对象决定是否以及何时将方法调用转到原始对象上. p ...
- [Spring手撸专栏学习笔记]——把AOP动态代理,融入到Bean的生命周期
本文是学习<Spring 手撸专栏>第 10 章笔记,主要记录我的一些debug调试过程,方便后期复习.具体学习,大家可以去看一下这个专栏,强烈推荐. 方案 其实在有了AOP的核心功能实现 ...
- Spring之AOP动态代理详解
动态代理 动态代理和静态代理角色一样 动态代理类是动态生成的,不是我们直接写好的. 动态代理分为两大类:基于接口的动态代理:JDK动态代理[我们在这里使用]基于类的动态代理:cglibjava字节码: ...
- spring aop 动态代理模拟
CGLIB 动态代理 public class HouserHost { public void rentHouse() { System.out.println("出租房屋了") ...
最新文章
- 聊聊《柒个我》这部剧
- 逻辑设计中需要显式地使用IBUF以及OBUF类似的原语吗?
- SSDT – Error SQL70001 This statement is not recognized in this context-摘自网络
- js如何获取文本节点的值?
- App Class Loader
- Java学习——使用Static修饰符
- java实用教程——组件及事件处理——ItemEvent事件(设置字体类型)
- 移动端web 禁止长按弹出的菜单 Safari
- 如何开始使用Java中的Lambda表达式
- 10g索引的作用实验1
- python生成随机字符串包含数字字母_用大写字母和数字随机生成字符串
- CXF入门教程(一)
- [Vue warn]: Attribute id is ignored on component div because the component is a fragment instanc
- wordpress 调用css,WordPress折腾记-精简CSS及JS在插件中的调用
- jq默认选中每项第一个
- TOOLFK工具-在线二维码解码工具
- 简单综合案例的统计学方法(总结试验性定量数据分析)
- 面试70问经典回答技巧
- 人脑与计算机之间有什么联系,再谈人脑与电脑的关系
- 广域网的基本概念和技术特点
热门文章
- windows 环境下python 安装 pypcap 并用pyinstaller打包到exe,解决DLL 加载失败。
- Executors线程池关闭时间计算
- 关于grep的引号使用问题
- java创建线程的几种方式
- vsftpd配置文件详解[转载]
- Best Practices for Web Apps
- QCopChannel的用法
- WINCE6.0+S3C2443睡眠和唤醒(sleep and wake up)的实现
- 【知识点】Java常用类库
- zabbix的主动模式和被动模式、添加监控主机、添加自定义模板、处理图形中的乱码、自动发现...