zoukankan      html  css  js  c++  java
  • 实现AOP功能的封装与配置的小框架

    内容

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

    设计(目录):

    XXX = java.util.ArrayList中

    代码

    Advice接口

    MyAdvice类

    BeanFactory类

    ProxyFactoryBean类

    AopFrameWorkTest类

    输出

    本文通过是动态代理实现的AOP功能的封装与配置的小框架.加深对动态代理和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功能的封装与配置的小框架

  • 相关阅读:
    struts2 的特征
    The method getJspApplicationContext(ServletContext) is undefined for the type JspFactory
    web.xml 404 500 配置
    重大发现 springmvc Controller 高级接收参数用法
    struts2 file
    struts2-core-2.3.20.jar
    系统设计工具
    Java基础
    IAM
    秒杀系统
  • 原文地址:https://www.cnblogs.com/Autumn-R/p/7094247.html
Copyright © 2011-2022 走看看