美文网首页
实现AOP功能的封装与配置的小框架

实现AOP功能的封装与配置的小框架

作者: Autumn丶Rains | 来源:发表于2017-06-29 14:24 被阅读0次

内容

java基础巩固笔记 - 实现AOP功能的封装与配置的小框架

设计(目录):

XXX = java.util.ArrayList中

代码

Advice接口

MyAdvice类

BeanFactory类

ProxyFactoryBean类

AopFrameWorkTest类

输出

本文通过是动态代理实现的AOP功能的封装与配置的小框架.加深对动态代理和AOP编程的理解

获取源码,学习交流,那就加入小编的学习交流群吧!616 959 444

设计

根据配置文件的键xxx对应的值(类全名)创建相应类的对象。

当且仅当xxx对应的值为com.iot.proxy.aopframework.ProxyFactoryBean时,则生成相应的动态代理类对象。代理对象的目标类和通知实现类分别由xxx.target和xxx.advice配置

配置文件

了解更多Java知识,获取原视频,源码,学习交流,那就加入小编的学习交流群吧!616 959 444

config.propertiest位于aopframework包下

xxx代表要加载的类

xxx.advice代表通知接口的某个实现类

xxx.target代表委托类

#xxx=java.util.ArrayList

xxx=com.iot.proxy.aopframework.ProxyFactoryBean

xxx.advice=com.iot.proxy.MyAdvice

xxx.target=java.util.ArrayList

包:com.iot.proxy.aopframework,有如下几个类/接口:

BeanFactory,用于读取配置文件,根据配置创建相应的对象

ProxyFactoryBean,用于生成代理对象,含有两个私有属性:目标和通知

Advice,通知接口,用于把切面的代码以对象的形式传递给InvocationHandler的的invoke方法

MyAdvice,Advice接口的一个实现类,打印执行方法前的时间及执行耗时

AopFrameWorkTest,测试效果

代码

Advice接口

package com.iot.proxy.aopframework;

import java.lang.reflect.Method;

/**

* Created by brian on 2016/2/2.

*/

public interface Advice {

void beforeMethod(Method method);

void aftereMethod(Method method);

}

MyAdvice类

package com.iot.proxy.aopframework;

import java.lang.reflect.Method;

/**

* Created by brian on 2016/2/2.

*/

public class MyAdvice implements Advice{

long beginTime = 0 ;

@Override

public void beforeMethod(Method method) {

System.out.println(method.getName()+" before at "+beginTime);

beginTime = System.currentTimeMillis();

}

@Override

public void aftereMethod(Method method) {

long endTime = System.currentTimeMillis();

System.out.println(method.getName()+" cost total "+ (endTime-beginTime));

}

}

获取源码,学习交流,那就加入小编的学习交流群吧!

616

959

444

BeanFactory类

package com.iot.proxy.aopframework;

import java.io.IOException;

import java.io.InputStream;

import java.util.Properties;

/**

* Created by brian on 2016/2/2.

*/

public class BeanFactory {

Properties properties = new Properties();

public BeanFactory(InputStream inputStream){

try {

properties.load(inputStream);

} catch (IOException e) {

e.printStackTrace();

}

}

public Object getBean(String name){

String className = properties.getProperty(name);

Object bean = null;

try {

Class clazz = Class.forName(className);

bean = clazz.newInstance();

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

}

if (bean instanceof ProxyFactoryBean){

ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;

Advice advice = null;

Object target = null;

try {

advice = (Advice) Class.forName(properties.getProperty(name+".advice")).newInstance();

target = Class.forName(properties.getProperty(name+".target")).newInstance();

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

proxyFactoryBean.setAdvice(advice);

proxyFactoryBean.setTarget(target);

Object proxy = ((ProxyFactoryBean) bean).getProxy();

return proxy;

}

return bean;

}

}

ProxyFactoryBean类

package com.iot.proxy.aopframework;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

/**

* Created by brian on 2016/2/3.

*/

public class ProxyFactoryBean {

private Object target;

private Advice advice;

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(method);

Object retVal = method.invoke(target,args);

advice.aftereMethod(method);

return retVal;

}

}

);

return proxy;

}

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;

}

}

AopFrameWorkTest类

package com.iot.proxy.aopframework;

import java.io.InputStream;

import java.util.Collection;

/**

* Created by brian on 2016/2/3.

*/

public class AopFrameWorkTest {

public static void main(String[] args) {

InputStream inputStream = AopFrameWorkTest.class.getResourceAsStream("config.properties");

Object bean = new BeanFactory(inputStream).getBean("xxx");

System.out.println(bean.getClass().getName());

((Collection) bean).clear();

}

}

获取源码,学习交流,那就加入小编的学习交流群吧!616 959 444

输出

配置

xxx=com.iot.proxy.aopframework.ProxyFactoryBean

输出为:

com.sun.proxy.$Proxy0clear before at 0clear cost total 0

配置

xxx=java.util.ArrayList

输出为:

java.util.ArrayList

可以看出,只改变配置文件,就可改变代码的运行结果,从而达到灵活的效果

相关文章

  • 实现AOP功能的封装与配置的小框架

    内容 java基础巩固笔记 - 实现AOP功能的封装与配置的小框架 设计(目录): XXX = java.util...

  • Ioc

    1.AOP的实现:1.1配置文件的形式实现的。 实现核心业务和辅助功能的交织: 目的是为了将核心业务与...

  • Spring之使用注解配置Spring AOP

    Spring框架通过注解配置AOP是基于AspectJ实现的。 Spring框架只是直接使用了AspectJ的注解...

  • ABP之AOP初显威

    技术和框架要点 ABPAOPIOCCastle AOP AOP,面向切面编程,通过运行期动态代理实现程序功能的统一...

  • JVM-SANDBOX

    JVM-SANDBOX的核心功能是什么? 实时无侵入AOP框架 在常见的AOP框架实现方案中,有静态编织和动态编织...

  • 2019-06-11

    四、Spring的AOP AOP实现可分为两类(按AOP框架修改源代码的时机): 静态AOP实现:AOP框架在编译...

  • Spring的AOP

    、Spring的AOP AOP实现可分为两类(按AOP框架修改源代码的时机): 静态AOP实现:AOP框架在编译阶...

  • 四、Spring的AOP

    AOP实现可分为两类(按AOP框架修改源代码的时机): 静态AOP实现:AOP框架在编译阶段对程序进行修改,即实现...

  • spring aop原理

    一、aop概念 1、aop:面向切面 编程,扩展功能不是修改源代码,而是通过配置或者其他方式实现2、aop采取横向...

  • 【知了堂学员笔记】那些年一起追过的Spring[3]-AOP

    核心概念: 切面,Aspect:其实就是我们需要定义的AOP类,它对功能类似的代码进行封装。 导包: XML配置:...

网友评论

      本文标题:实现AOP功能的封装与配置的小框架

      本文链接:https://www.haomeiwen.com/subject/xevmcxtx.html