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 底层实现原理的更多相关文章

  1. AOP基本概念、AOP底层实现原理、AOP经典应用【事务管理、异常日志处理、方法审计】

    1 什么是AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件 ...

  2. AOP底层实现原理,动态代理如何动态

    代理 指定另外一个主体代替原来的某个主体去执行某个事物 代理执行的人 需要代理的人 需要代理的事情是一定要做的 但是被代理的人没有时间或自己做的不专业 静态代理: 父母朋友帮忙物色找对象 代理人掌握需 ...

  3. Spring框架学习06——AOP底层实现原理

    在Java中有多种动态代理技术,如JDK.CGLIB.Javassist.ASM,其中最常用的动态代理技术是JDK和CGLIB. 1.JDK的动态代理 JDK动态代理是java.lang.reflec ...

  4. AOP底层实现原理

    有两种方法实现: 当实现接口时,采用动态代理 另一种采用cglib cglib和动态代理并没有谁好谁坏,就像做菜一样,一种菜可以有多种味道,使用不同的方法就有不同的模式

  5. Spring Aop底层原理详解

    Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)

  6. Spring AOP的底层实现原理

    Spring的两大核心之一就是AOP,AOP:面向切面编程.在说原理之前,得先知道一些 AOP的专业术语. AOP的专业术语 连接点(JoinPoint):增强执行的位置(增加代码的位置),Sprin ...

  7. JAVA框架 Spring AOP底层原理

    一:AOP(Aspect Oriented Programming)面向切面编程. 底层实现原理是java的动态代理:1.jdk的动态代理.2.spring的cglib代理. jdk的动态代理需要被代 ...

  8. spring AOP底层原理实现——jdk动态代理

    spring AOP底层原理实现——jdk动态代理

  9. Spring AOP底层原理

    ------------------siwuxie095                                 Spring AOP 底层原理         AOP 即 Aspect Or ...

随机推荐

  1. 什么是实体关系图(ERD)? 转

    https://www.visual-paradigm.com/cn/guide/data-modeling/what-is-entity-relationship-diagram/#erd-data ...

  2. github安全整理

    漏洞及渗透练习平台: WebGoat漏洞练习平台: https://github.com/WebGoat/WebGoat webgoat-legacy漏洞练习平台: https://github.co ...

  3. 禁止html页面返回上一层

    两种方式: // 方式一 触发返回上一层页面事件,只会重新加载当前页面 window.addEventListener('pageshow', function(e) { if (e.persiste ...

  4. 创建守护进程步骤与setsid()

    原创:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且 ...

  5. YOLO---Darknet下的 GPU vs CPU 速度

    YOLO---Darknet下的 GPU vs CPU 速度 目录 一.基础环境 二.安装Darknet-yolo v3 三.CPU下测试 四.GPU下测试 五.测试速度对比结论 正文 一.基础环境 ...

  6. tensorflow实战笔记(18)----textCNN

    一.import 包 import os import pandas as pd import csv import time import datetime import numpy as np i ...

  7. javascript如何处理字符串中的\u

    问题: 字符串在页面显示的时候,有\u,如:Tesla\u8fc1\u79fb ,想要显示它的原文 let a = 'Tesla\u8fc1\u79fb' //显示 Tesla迁移 alert( un ...

  8. 《流畅的Python》Data Structures--第3章 dict 和 set

    dict and set 字典数据活跃在所有的python程序背后,即使你的源码里并没有直接使用它. 和dict有关的内置函数在模块builtins的__dict__内. >>> _ ...

  9. DevExpress WPF v19.2图表图形控件功能增强?速速种草

    通过DevExpress WPF Controls,你能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案. 无论是Office办公软件的衍 ...

  10. [codeforces][dp]

    链接:https://ac.nowcoder.com/acm/problem/21314来源:牛客网 题目描述 牛牛正在打一场CF 比赛时间为T分钟,有N道题,可以在比赛时间内的任意时间提交代码 第i ...