黑马程序员——类似于spring的AOP框架

BeanFactory.java的代码

package com.itAOP;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

/*
 * 整体的工作原理是这样的:
 * 工厂类BeanFactory在创建目标类或代理的对象的时候,先由getBean接收一个字符串,
 * 然后到配置文件中查找器对应的字符串并产生器对象,如果这个对象是ProxyFactoryBean类的
 * 实例对象,那么ProxyFactoryBean调用getProxy产生并返回代理对象;如果不是,直接返回
 * 这个目标对象。在配置文件中可以切换该字符串的内容
 *
 * BeanFactory是一个Bean的工厂类,专门用于产生Bean,在它里面调用了一个特殊的类是ProxyFactoryBean
 * ProxyFactoryBean也是一个Bean,但他同时也是一个Proxy的一个工厂,专门用来产生代理的
 *
 */

//BeanFactory就是负责创建目标类或代理类的对象,并通过配置文件实现切换
public class BeanFactory {
    //这种配置文件是Propeties格式的
    Properties properties = new Properties();
    //实例化BeanFactory的时候,需要给他传入一个配置文件,直接就传入一个流了
    public BeanFactory(InputStream inputStream){
        try {
            //将文件加载进来
            properties.load(inputStream);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //创建出对应name的对象或代理
    public Object getBean(String name){
        Object bean = null;
        try {
            //这就是为什么Bean当中必须有一个无参的构造方法了,newInsatance()
            bean = Class.forName(properties.getProperty(name)).newInstance();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //判断这个对象是否是ProxyFactory的实例对象
        if(bean instanceof ProxyFactoryBean){
            Object proxy = null;
            ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;
            try {
                Class clazzAdvice = Class.forName(properties.getProperty(name+".advice"));
                proxyFactoryBean.setAdvice((Advice)clazzAdvice.newInstance());
                Class clazzTarget = Class.forName(properties.getProperty(name+".target"));
                proxyFactoryBean.setTarget((Object)clazzTarget.newInstance());
                //产生代理对象
                proxy = proxyFactoryBean.getProxy();
            } catch (ClassNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InstantiationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            return proxy;

        }
        return bean;

    }

}

ProxyFactoryBean.java的代码

package com.itAOP;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactoryBean {
    private Advice advice = null;
    private Object target = null;

    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;
    }

    //方法里主要用到了两个参数,target和advice,这里定义为成员变量
    public Object getProxy() {
        // TODO Auto-generated method stub
        Object objProxy = (Object)Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(),
                new InvocationHandler(){
                    //这里定义一个目标

                    @Override
                    public Object invoke(Object proxy, Method method,
                            Object[] args) throws Throwable {
                        // TODO Auto-generated method stub
                        advice.methodBefore(method);
                        //在目标上执行代理的那个方法
                        Object obj = method.invoke(target, args);
                        advice.methodAfter(method);
                        return obj;
                    }

                }
        );
        return objProxy;
    }

}

测试类BeanFactory.java

package com.itAOP;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

public class BeanFactoryTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

        //在Class类里可以通过getResourceAsStream()来获取InputStream
        InputStream inputStream = BeanFactoryTest.class.getResourceAsStream("config.properties");
        BeanFactory bean = new BeanFactory(inputStream);
        Object obj = bean.getBean("nihao");

        System.out.println(obj.getClass().getName());
       obj.add("123");    

    }

}

配置文件config.properties

nihao=java.util.ArrayList
#nihao=com.itAOP.ProxyFactoryBean
nihao.advice=com.itAOP.MyAdvice
nihao.target=java.util.ArrayList

Advice接口

package com.itAOP;

import java.lang.reflect.Method;

public interface Advice {
    public void methodBefore(Method method);
    public void methodAfter(Method method);

}

实现Advice接口的子类MyAdvice.java

package com.itAOP;

import java.lang.reflect.Method;

public class MyAdvice implements Advice {

    private long beginTime = 0;
    @Override
    public void methodBefore(Method method) {
        // TODO Auto-generated method stub
        //我们可以再执行目标的前后干一些其他的事情,比如下面
        //System.currentTimeMillis()返回的当前时间的毫秒
        System.out.println("我来了");
        beginTime = System.currentTimeMillis();
    }

    @Override
    public void methodAfter(Method method) {
        // TODO Auto-generated method stub
        long endTime = System.currentTimeMillis();
        System.out.println(method.getName()+"......"+(endTime-beginTime));
        System.out.println("我走了");
    }

}

黑马程序员——类似于spring的AOP框架

时间: 2024-10-12 19:11:32

黑马程序员——类似于spring的AOP框架的相关文章

黑马程序员_代理和AOP(一)

/** * 代理和AOP(一) * * 1.分析代理类的作用与原理及AOP的概念 * * 1.1 代理类:一个代理类通常有自己的代理目标类,代理类是对目标类的代理,一般代理类的方法和目标类的方法签名一致,是对 * 目标类的包装,代理类的各个方法中通常除了要调用目标的相应方法和对外返回目标的方法返回的结果之外, * 还可以在代理类的方法中 加入一些系统功能代码,添加的位置有四个地方: * 分别是目标方法调用前,目标方法调用后,目标方法调用前后,在处理目标方法异常的catch块中. * 例如: *

黑马程序员——OC学习总结--Founation框架

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1.常用结构体 在 Founation 框架中 对NSRange NSPoint NSrect NSSize 有了定义 他们常这样被创建: #import <Founation/Founation.h> void main(){ @autoreleasepool{ //Range的使用 NSRange rang=NSMakeRange(10,34);//指定一个起止范围 //CGRang r

黑马程序员——OC学习小结------Foundation框架

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.常用的结构体 NSRange (location,length) NSPoint\CGPoint (x,y) NSSize\CGSize (width, height) NSRect\CGRect (CGPoint,CGSize) NSRange void range() { /* @"i love oc" love的范围 NSRange r1 = {2, 4}; // 不用 N

黑马程序员_OC学习笔记之Foundation框架集合类

OC--集合类 1.OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 2.OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加* 3.NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变 4.NSArray数组和子类NSMutableArray的基本操作: 1>使用NS

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象

黑马程序员之——Map、泛型、集合框架工具类:Collections,Arrays

第一讲,第二讲:黑马程序员_毕向东_Java基础视频教程第15天-06-集合框架(泛型概述),(泛型使用) 一,泛型了解: 泛型的由来:泛型是JDK1.5版本以后出现的新特性.用于解决安全问题,是一个类型安全机制. 好处:将运行时期出现的问题ClassCastException,转移到了编译时期.方便于程序员解决问题.让运行时期问题减少.安全. 好处:避免了强制转换的麻烦. 二,泛型的格式:通过<>来定义要操作的引用数据类型.    如:ArrayList<String>  //定

黑马程序员_Java集合框架

- - - - - android培训.java培训.期待与您交流! - - - - - - 集合框架:用于存储数据的容器. 特点: 对象封装数据,对象多了也需要存储.集合用于存储对象. 对象的个数确定可以使用数组.如果不确定可以用集合.因为集合是可变长度的. 集合和数组的区别: 数组是固定长度的:集合可变长度的. 数组可以存储基本数据类型,也可以存储引用数据类型:集合只能存储引用数据类型. 数组存储的元素必须是同一个数据类型:集合存储的对象可以是不同数据类型. 数据结构:就是容器中存储数据的方

黑马程序员-OC学习笔记之Foundation框架NSNumber、NSValue和NSDate

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSNumber 前几篇笔记中,小桥复习了Foundatio框架中的几个类,这三个是OC学习的尾声了. 小桥已经复习过OC数组类NSArray,也说过它只能存放OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int.float,结构体存放的OC数组中,怎么办?这里的NSNumber就有用了,它能够把基本数据类型包装成OC对象.

黑马程序员学习笔记-OC之foundation框架

黑马程序员学习笔记-OC之foundation框架 1.简介:foundation框架是其它所有ios框架的基础,包含了很多常用类型,结构体.枚举.类等. 2. 结构体:NSRange表示范围的结构体. NSPoint/CGPoint表示坐标点的结构体 NSSize/CGSize表示宽高的结构体 NSRect/CGRect表示坐标点+宽高的结构体 3. 类字符串:NSString  字符串类 NSMUtableString  易变字符串类 NSArray         数组类 NSMUtabl