AOP 底层实现原理
1、核心业务接口与实现
public interface IManager {
void add(String item);
}
public class IManagerImpl implements IManager {
private List<String> list = new ArrayList<>();
@Override
public void add(String item) {
list.add(item);
}
}
2、通知接口与实现
public interface Advice {
void beforeAdvice();
void afterAdvice();
}
public class AdviceImpl implements Advice {
@Override
public void beforeAdvice() {
System.out.println("Method start time: " + System.currentTimeMillis());
}
@Override
public void afterAdvice() {
System.out.println("Method end time: " + System.currentTimeMillis());
}
}
3、动态代理类(关联核心业务与通知切面)
public class ProxyFactory implements InvocationHandler {
// 被代理对象
private Object target;
// 通知
private Advice advice;
/**
* 通过目标对象返回动态代理对象
* @return
*/
public Object getProxy() {
Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
return proxy;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
advice.beforeAdvice();
Object obj = method.invoke(target, args);
advice.afterAdvice();
return obj;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public Advice getAdvice() {
return advice;
}
public void setAdvice(Advice advice) {
this.advice = advice;
}
}
4、通过配置文件反射实现代理、业务、通知
public class BeanFactory {
Properties prop = new Properties();
public BeanFactory(InputStream input) {
try {
prop.load(input);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 获取Proxy(代理对象) 的实例
* @param name
* @return
*/
public Object getBean(String name) {
// 获取ProxyFactory 的class 名称
String className = prop.getProperty(name + ".proxy");
Object proxy = null;
try {
// 获取ProxyFactory 的class对象
Class proxyClass = Class.forName(className);
proxy = proxyClass.newInstance();
// 根据配置文件实例化target 与 advice对象
Object target = Class.forName(prop.getProperty(name + ".target")).newInstance();
Object advice = Class.forName(prop.getProperty(name + ".advice")).newInstance();
// 通过内省实现对ProxyFactory的属性赋值
BeanInfo beanInfo = Introspector.getBeanInfo(proxyClass);
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor pd : propertyDescriptors) {
String propertyName = pd.getName();
Method writeMethod = pd.getWriteMethod();
if ("target".equals(propertyName)) {
writeMethod.invoke(proxy, target);
} else if ("advice".equals(propertyName)) {
writeMethod.invoke(proxy, advice);
}
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IntrospectionException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
return proxy;
}
}
5、测试
public class AopTest {
public static void main (String[] args) {
// 读取配置文件
InputStream input = Thread.currentThread().getContextClassLoader()
.getResourceAsStream("cn/latiny/aopa/bean.properties");
// 创建Bean的工厂类
BeanFactory beanFactory = new BeanFactory(input);
// 获取代理对象
ProxyFactory proxyFactory = (ProxyFactory)beanFactory.getBean("bean");
// 通过代理对象调用
IManager bean = (IManager)proxyFactory.getProxy();
bean.add("Latiny");
}
}
AOP 底层实现原理的更多相关文章
- AOP基本概念、AOP底层实现原理、AOP经典应用【事务管理、异常日志处理、方法审计】
1 什么是AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...
- AOP底层实现原理,动态代理如何动态
代理 指定另外一个主体代替原来的某个主体去执行某个事物 代理执行的人 需要代理的人 需要代理的事情是一定要做的 但是被代理的人没有时间或自己做的不专业 静态代理: 父母朋友帮忙物色找对象 代理人掌握需 ...
- Spring框架学习06——AOP底层实现原理
在Java中有多种动态代理技术,如JDK.CGLIB.Javassist.ASM,其中最常用的动态代理技术是JDK和CGLIB. 1.JDK的动态代理 JDK动态代理是java.lang.reflec ...
- AOP底层实现原理
有两种方法实现: 当实现接口时,采用动态代理 另一种采用cglib cglib和动态代理并没有谁好谁坏,就像做菜一样,一种菜可以有多种味道,使用不同的方法就有不同的模式
- Spring Aop底层原理详解
Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)
- Spring AOP的底层实现原理
Spring的两大核心之一就是AOP,AOP:面向切面编程.在说原理之前,得先知道一些 AOP的专业术语. AOP的专业术语 连接点(JoinPoint):增强执行的位置(增加代码的位置),Sprin ...
- JAVA框架 Spring AOP底层原理
一:AOP(Aspect Oriented Programming)面向切面编程. 底层实现原理是java的动态代理:1.jdk的动态代理.2.spring的cglib代理. jdk的动态代理需要被代 ...
- spring AOP底层原理实现——jdk动态代理
spring AOP底层原理实现——jdk动态代理
- Spring AOP底层原理
------------------siwuxie095 Spring AOP 底层原理 AOP 即 Aspect Or ...
随机推荐
- restTemplate源码解析(五)处理ClientHttpResponse响应对象
所有文章 https://www.cnblogs.com/lay2017/p/11740855.html 正文 上一篇文章中,我们执行了ClientHttpRequest与服务端进行交互.并返回了一个 ...
- wangeditor富编辑器在node和vue前后台分离的使用
本来是想用百度的ueditor编辑器来达到想要的功能的,但在使用中,感觉前后台分离上,需要引入的东西过多,不轻量:然后就去尝试用wangeditor(这个名字听着感觉有点太随意的感觉....但功能上还 ...
- vulnhub攻略
https://www.vulnhub.com/entry/21ltr-scene-1,3/ 这个靶机国内https://www.cnblogs.com/hack404/p/11423228.html ...
- Android休眠唤醒机制
有四种方式可以引起休眠 ①在wake_unlock()中, 如果发现解锁以后没有任何其他的wake lock了, 就开始休眠 ②在定时器到时间以后, 定时器的回调函数会查看是否有其他的wake loc ...
- http服务详解(1)
前言:要熟练掌握一个服务,首先需要非常了解这个服务的工作过程. 跨网络的主机间通讯 在建立通信连接的每一端,进程间的传输要有两个标志: IP地址和端口号,合称为套接字地址 socket address ...
- 13 Windows编程——系统内置窗口子类型之静态子窗口
静态子窗口类型 wndclass:static 源码 #include<Windows.h> #include<Windowsx.h> HINSTANCE G_h; LRESU ...
- 【转】优秀的Go开源项目
http://www.mhtclub.com/post/60 目录 优秀的Go开源项目 中文Go语言学习教程 国外的Go语言教程 openbilibili源码 Go作为Google2009年推出的 ...
- NLP学习(2)----文本分类模型
实战:https://github.com/jiangxinyang227/NLP-Project 一.简介: 1.传统的文本分类方法:[人工特征工程+浅层分类模型] (1)文本预处理: ①(中文) ...
- Week08_day01 (Hive开窗函数 row_number()的使用 (求出所有薪水前两名的部门))
数据准备: 7369,SMITH,CLERK,7902,1980-12-17,800,null,20 7499,ALLEN,SALESMAN,7698,1981-02-20,1600,300,30 7 ...
- 大数据之路week04--day06(I/O流阶段一 之异常)
从这节开始,进入对I/O流的系统学习,I/O流在往后大数据的学习道路上尤为重要!!!极为重要,必须要提起重视,它与集合,多线程,网络编程,可以说在往后学习或者是工作上,起到一个基石的作用,没了地基,房 ...