zoukankan      html  css  js  c++  java
  • 实现类似AOP的封装和配置

      这是张孝祥老师Java进阶讲解中最后一个视频,就是实现类似spring中的AOP的封装和配置,特别特别小型的一个框架雏形,但是spring中的核心思想还是体现出来了,真的厉害,张老师!!!

    一、重点知识点

    1、工厂类BeanFactory负责创建目标类或者是代理类的实例对象,并通过配置文件实现切换,其getBean()方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则,返回该实例对象的getProxy()方法返回的对象

    2、BeanFactory的构造方法接收代表配置文件的输入流

    3、ProxyFactoryBean充当封装生成动态代理的工厂,需要为工厂类提供目标、通知等参数信息

    4、编写测试类进行测试

    二、代码实现

    整体代码结构:

    代码实现:

    1、通知接口以及实现类

     1 package com.ssc.proxy;
     2 
     3 import java.lang.reflect.Method;
     4 
     5 public interface Advice {
     6 
     7     void beforeMethod(Method method);
     8     void afterMethod(Method method);
     9     
    10 }
    11 
    12 ---------------------------------------------------------------------------
    13 
    14 package com.ssc.proxy;
    15 
    16 import java.lang.reflect.Method;
    17 
    18 public class MyAdvice implements Advice {
    19 
    20     long beginTime = 0;
    21     long endTime = 0;
    22     
    23     @Override
    24     public void beforeMethod(Method method) {
    25         System.out.println("Advice中的方法开始执行了。。。");
    26         beginTime = System.currentTimeMillis();
    27     }
    28 
    29     @Override
    30     public void afterMethod(Method method) {
    31         endTime = System.currentTimeMillis();
    32         System.out.println(method.getName() + "running time:" + (endTime - beginTime));
    33         System.out.println("Advice中的方法结束执行了。。。");
    34     }
    35 
    36 }

    2、BeanFactory实现

     1 package com.ssc.aopframework;
     2 
     3 import java.io.IOException;
     4 import java.io.InputStream;
     5 import java.util.Properties;
     6 
     7 import com.ssc.proxy.Advice;
     8 
     9 public class BeanFactory {
    10 
    11     Properties props = new Properties();
    12     
    13     public BeanFactory(InputStream ips){
    14         try {
    15             props.load(ips);
    16         } catch (IOException e) {
    17             e.printStackTrace();
    18         }
    19     }
    20     
    21     public Object getBean(String name){
    22         String className = props.getProperty(name);
    23         Object bean = null;
    24         try {
    25             Class clazz = Class.forName(className);
    26             bean = clazz.newInstance();
    27         } catch (Exception e) {
    28             e.printStackTrace();
    29         }
    30         if(bean instanceof ProxyFactoryBean){
    31             Object proxy = null;
    32             ProxyFactoryBean proxyBeanFactory = (ProxyFactoryBean) bean;
    33             try {
    34                 // 从配置文件中读取类名,通过反射创建对象参数
    35                 Advice advice = (Advice) Class.forName(props.getProperty(name + ".advice")).newInstance();
    36                 Object target = Class.forName(props.getProperty(name + ".target")).newInstance();
    37                 // 初始化通知以及目标参数
    38                 proxyBeanFactory.setAdvice(advice);
    39                 proxyBeanFactory.setTarget(target);
    40                 proxy = proxyBeanFactory.getProxy();
    41                 return proxy;
    42             } catch (Exception e) {
    43                 e.printStackTrace();
    44             }
    45         }
    46         return bean;
    47     }
    48 }

    3、ProxyFactoryBean 实现

     1 package com.ssc.aopframework;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.lang.reflect.Proxy;
     6 
     7 import com.ssc.proxy.Advice;
     8 
     9 public class ProxyFactoryBean {
    10 
    11     private Advice advice;
    12 
    13     private Object target;
    14 
    15     public Object getProxy() {
    16         Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass()
    17                 .getInterfaces(), new InvocationHandler() {
    18 
    19             @Override
    20             public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    21 
    22                 // 这里就是Collection类或者是子类中的方法执行 也就是调用了add()方法 同时我还做了一些其他事情。计算程序运行时间
    23                 advice.beforeMethod(method);
    24                 Object retVal = method.invoke(target, args);
    25                 advice.afterMethod(method);
    26 
    27                 return retVal;
    28             }
    29         });
    30         return proxy;
    31     }
    32 
    33     public Advice getAdvice() {
    34         return advice;
    35     }
    36 
    37     public void setAdvice(Advice advice) {
    38         this.advice = advice;
    39     }
    40 
    41     public Object getTarget() {
    42         return target;
    43     }
    44 
    45     public void setTarget(Object target) {
    46         this.target = target;
    47     }
    48 
    49 }

    4、配置文件实现(纯粹瞎写的配置文件)

    1 #xxx=java.util.ArrayList
    2 xxx=com.ssc.aopframework.ProxyFactoryBean
    3 xxx.advice=com.ssc.proxy.MyAdvice
    4 xxx.target=java.util.ArrayList

    5、测试类实现

     1 package com.ssc.aopframework;
     2 
     3 import java.io.InputStream;
     4 
     5 public class AopFrameworkTest {
     6 
     7     public static void main(String[] args) {
     8         InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");
     9         Object bean = new BeanFactory(ips).getBean("xxx");
    10         System.out.println(bean.getClass().getName());
    11     }
    12 }
  • 相关阅读:
    设置VSS2005使支持通过Internet访问
    Twisted网络编程必备(3)
    Python中re(正则表达式)模块学习
    Python中最快的字典排序方法
    理解Python命名机制
    Twisted网络编程必备(2)
    threading 多线程控制和处理
    Twisted网络编程必备(5)
    Python中动态创建类实例
    判断是否为字符串
  • 原文地址:https://www.cnblogs.com/ssh-html/p/10864979.html
Copyright © 2011-2022 走看看