面向切面编程:

通过动态代理+加配置文件

目的解耦

给主逻辑添加一些修饰功能,但是不在主逻辑代码中进行修改,有点类似python中的装饰器,调用方法还是是通过接口的那个类来调用:

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Properties; public class Demo {
public static void main(String[] args) {
//读取配置文件
InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("com\\first\\conf.properties");
//获取bean的工厂
BeanFactory beanFactory = new BeanFactory(resourceAsStream);
ProxyFactorybean bean = ((ProxyFactorybean) beanFactory.getBean("bean"));
//获取代理对象 ,注意:需要用 target的继承的接口来 cast
Action proxy = ((Action) bean.getProxy());
proxy.test();
}
} interface Advice{
public void berforeAdvice();
public void afterAdvice();
}
class LoginAdvice implements Advice{
@Override
public void berforeAdvice() {
System.out.println("开始添加日志"+System.currentTimeMillis());
}
@Override
public void afterAdvice() {
System.out.println("结束添加日志"+System.currentTimeMillis());
}
} interface Action{
public void test();
}
class IManage implements Action{
public void test(){
System.out.println("执行添加功能");
}
} //工厂(生产代理对象)
class ProxyFactorybean implements InvocationHandler{
//被代理对象
private Object target;
//切片对象
private Advice advice;
//生产代理对象
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.berforeAdvice();
method.invoke(target,args);
advice.afterAdvice();
return null;
}
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;
}
} //工厂(生产Bean)
class BeanFactory{
Properties prop = new Properties();
public BeanFactory(InputStream in){
try {
prop.load(in); } catch (IOException e) {
e.printStackTrace();
}
}
//获取一个Bean实例,通过反射的方式动态创建;
public Object getBean(String name){
Object bean=null;
String className = prop.getProperty(name);
try {
Class<?> aClass = Class.forName(className);
bean = aClass.newInstance();
//创建目标对象
Object target = Class.forName(prop.getProperty(name + ".target")).newInstance();
//创建切片对象
Object advice = Class.forName(prop.getProperty(name + ".advice")).newInstance();
//创建bean属性描述器
BeanInfo beanInfo = Introspector.getBeanInfo(aClass);
//通过内省内省实现对bean对象的属性赋值
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (int i = 0; i < propertyDescriptors.length; i++) {
String name1 = propertyDescriptors[i].getName();
Method writeMethod = propertyDescriptors[i].getWriteMethod();
if ("target".equals(name1)){
writeMethod.invoke(bean,target);
}
if ("advice".equals(name1)){
writeMethod.invoke(bean,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 bean;
}
}

  

java----AOP框架理解的更多相关文章

  1. java aop的理解

    https://www.cnblogs.com/mafly/p/SpringAOP.html

  2. SSM框架中IoC、DI与AOP的理解

    框架封装了普通项目中程序员需要重复书写的代码和调用过程,就比如说在传统的jsp项目中,我们的controller接收到前端的请求然后程序员就需要去开发Dao层,里面还涉及数据库的连接和存储过程的代码, ...

  3. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring AOP(面向切面编程)

    面向切面编程(AOP)和面向对象编程(OOP)类似,也是一种编程模式.Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的松耦合目的. AOP ...

  4. 《深入理解Java集合框架》系列文章

    Introduction 关于C++标准模板库(Standard Template Library, STL)的书籍和资料有很多,关于Java集合框架(Java Collections Framewo ...

  5. Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架

    类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...

  6. 我所理解Java集合框架的部分的使用(Collection和Map)

    所谓集合,就是和数组类似——一组数据.java中提供了一些处理集合数据的类和接口,以供我们使用. 由于数组的长度固定,处理不定数量的数据比较麻烦,于是就有了集合. 以下是java集合框架(短虚线表示接 ...

  7. 【深入理解Java集合框架】红黑树讲解(上)

    来源:史上最清晰的红黑树讲解(上) - CarpenterLee 作者:CarpenterLee(转载已获得作者许可,如需转载请与原作者联系) 文中所有图片点击之后均可查看大图! 史上最清晰的红黑树讲 ...

  8. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  9. java 实现类似spring的可配置的AOP框架

    一.工厂类BeanFactory: 1.工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换. 2.getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符 ...

  10. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring使用AspectJ开发AOP基于XML和基于Annotation

    AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言.Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 Aspe ...

随机推荐

  1. Java基础 变量的作用域

    变量的作用域: 1. Java用一对大括号作为语句块的范围,称为作用域. 2.作用域中的变量不能重复定义. 3.离开作用域,变量所分配的内存空间将被JVM回收. public void name(){ ...

  2. Maven项目配置logback

    首先,在pom.xml中加入maven依赖 <!-- log start --> <dependency> <groupId>org.slf4j</group ...

  3. response的字节流和字符流输入的区别和问题--02-response的outputStream输出数据的问题.avi

    02-response的outputStream输出数据的问题.avi; [字节流] 用meta标签 第一段原始代码:写错: 03-response的Writer输出数据的问题.avi;[字符流输出] ...

  4. SQLServer语法常用总结

    1. 有时候查看SQL的时候表名或者字段名需要加[],这是因为有时候你的表名或者字段名正好与sqlserver的保留字段重了 比如:有一个user表,直接select会报错 select * from ...

  5. [转] 隐马尔可夫(HMM)、前/后向算法、Viterbi算法 再次总结

    最近工作需要优化LSTM-CRF经典模型中的维特比解码部分,发现对维特比一直是个模糊概念,没有get到本质,搜了一圈,发现一篇好文,mark 博主不让转载,mark个地址吧: https://blog ...

  6. 学习基础和C语言基础调查

    学习基础和C语言基础调查 一.一种比大多数人(超过90%以上)更好的技能 说句实话,我还没有那种特别特别自信的.说我能拿得出手的.所谓能超过百分之九十以上的人的技能.毕竟人外有人,天外有天. 姑且算上 ...

  7. 虚拟化之kvm --(vnc控制台)

    作者:邓聪聪 随着日益不同的需求增多,为了满足主机供求,get到这一招虚拟化技术,以增加点见识! 1.使用yum安装: yum -y install qemu-kvm libvirt python-v ...

  8. jquery获取浏览器URL参数

    getRequestParams:function(param){ var reg = new RegExp("(^|&)" + param + "=([^&am ...

  9. centos6下安装php7的memcached扩展

    安装php7的memcached扩展 .编译安装libmemcached- wget https://launchpadlibrarian.net/165454254/libmemcached-1.0 ...

  10. GO 新开发者要注意的陷阱和常见错误

    转自:http://colobu.com/2015/09/07/gotchas-and-common-mistakes-in-go-golang/ 初级 开大括号不能放在单独的一行 未使用的变量 未使 ...