手动实现Spring Aop
来源:互联网 发布:英国的青年知乎 编辑:程序博客网 时间:2024/05/29 07:59
Aop,百度百科的解释:在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
到底什么是Aop呢?下面来实现一个:
1、Advice接口,Advice实现类
public interface Advice { public void beforeMethod(); public void afterMethod();}
public class MyAdvice implements Advice{ @Override public void beforeMethod() { System.out.println("beforeMethod!!!"); } @Override public void afterMethod() { System.out.println("afterMethod!!!"); }}
2、目标接口,目标实现类
public interface MyObjectInterface { public void print();}
public class MyObject implements MyObjectInterface { @Override public void print() { System.out.println("这是MyObject类!!"); }}
3、编写BeanFactory
public class BeanFactory { Properties prop = new Properties(); /** * 构造方法,传入InputStream * * @param ips */ public BeanFactory(InputStream ips){ try { prop.load(ips); } catch (IOException e) { e.printStackTrace(); }; } public Object getBean(String name){ String className = prop.getProperty(name); Object bean = null; try { Class clazz = Class.forName(className); bean = clazz.newInstance(); } catch (Exception e) { e.printStackTrace(); } if (bean instanceof ProxyFactoryBean) { Object proxy = null; try { ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean; Advice advice = (Advice)Class.forName(prop.getProperty("advice")).newInstance(); Object target = Class.forName(prop.getProperty("target")).newInstance(); proxyFactoryBean.setAdvice(advice); proxyFactoryBean.setTarget(target); proxy = proxyFactoryBean.getProxy(); } catch (Exception e) { e.printStackTrace(); } return proxy; } return bean; }}
4、编写ProxyFactoryBean
public class ProxyFactoryBean { private Advice advice; private Object target; public Advice getAdvice() { return advice; } public void setAdvice(Advice advice) { this.advice = advice; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public Object getProxy() { Object proxy = Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advice.beforeMethod(); Object reVal = method.invoke(target, args); advice.afterMethod(); return reVal; } }); return proxy; }}
5、测试类:
public class AopTest { public static void main(String[] args) { InputStream ips = AopTest.class.getResourceAsStream("conf.properties"); Object bean = new BeanFactory(ips).getBean("aop"); System.out.println(bean.getClass().getName()); ((MyObjectInterface)bean).print(); }}
6、配置文件conf.properties:
#aop=java.util.ArrayListaop=aop_impl.ProxyFactoryBeanadvice=aop_impl.MyAdvicetarget=aop_impl.MyObject
7、运行结果:
0 0
- 手动实现Spring Aop
- spring 手动实现aop管理事务
- 【Spring】手动实现AOP编程(十一)
- spring中手动实现AOP编程
- Spring第五篇【cglib、手动实现AOP编程】
- 动态代理手动实现Spring AOP的基本功能
- 手动实现AOP编程
- 手动实现Aop
- C# AOP手动实现
- spring(AOP) 注解实现aop
- 第37天(就业班) 静态代理与动态代理、oglib代理、手动实现aop编程、注解实现AOP编程、aop相关的几个注解、xml实现aop、切入点表达式、spring对aop模式
- Spring的AOP实现
- spring AOP实现原理
- Spring Aop Schema 实现
- spring注解实现AOP
- Spring 实现AOP功能
- Spring 实现AOP
- spring实现AOP
- Two pointers (5) -- Remove Duplicates from Sorted Array I, II, Move Zeroes, Remove Element
- C++学习第四课
- Redis-内存
- 简单编程题目连载(十)——公共最长子序列
- Glide进阶详解(十一)
- 手动实现Spring Aop
- Xcode模拟器很慢
- linux下安装subversion1.9.5
- PHP MVC 小实例
- 好用的运维工具Open-Falcon
- XML解析方式及GData框架使用
- wikioi 数的划分
- Glide进阶详解(十二)
- Android设计模式之原型模式