一、工厂类BeanFactory:

1、工厂类BeanFactory负责创建目标类或代理类的实例对象,并通过配置文件实现切换。

2、getBean方法根据参数字符串返回一个相应的实例对象,如果参数字符串在配置文件中对应的类名不是ProxyFactoryBean,则直接返回该类的实例对象,否则返回该类示例对象的getProxy方法返回的对象。

3、BeanFactory的构造方法接收代表配置文件的输入流对象的配置文件格式如下:

#xxx=java.util.ArrayList

xxx=cn.itcast.test3.aopframework.ProxyFactoryBean

xxx.advice=cn.itcast.test3.MyAdvice

xxx.target=java.util. ArrayList

注意:其中的#代表注释当前行。

4、ProxyFactoryBean充当封装成动态的工厂,需为工厂提供的配置参数信息包括:

目标(target)

通告(advice)

5、BeanFactory和ProxyFactoryBean:

1)BeanFactory是一个纯粹的bean工程,就是创建bean即相应的对象的工厂。

2)ProxyfactoryBean是BeanFactory中的一个特殊的Bean,是创建代理的工厂。

二、实现类似spring的可配置的AOP框架的思路:

1、创建BeanFactory类:

1)构造方法:接受一个配置文件,通过Properties对象加载InputStream流对象获得。

2)创建getBean(String name)方法,接收Bean的名字,从上面加载后的对象获得。

3)通过其字节码对象创建实例对象bean。

4)判断bean是否是特殊的Bean即ProxyFactoryBean,如果是,就要创建代理类,并设置目标和通告,分别得到各自的实例对象,并返回代理类实例对象。如果不是在返回普通类的实例对象。

2、创建ProxyFactoryBean(接口),此处用类做测试,其中有一个getProxy方法,用于获得代理类对象。

3、对配置文件进行配置,如上面配置一样。

4、作一个测试类:AopFrameworkTest进行测试。

//创建BeanFactory类

package cn.itcast.test3.aopframework;

import java.io.IOException;

import java.io.InputStream;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

import java.util.Properties;

public class BeanFactory {

Properties prop = new Properties();

//创建对象时需要传入一个配置文件中的数据,所以需要在构造方法中接受一个参数

public BeanFactory(InputStream ips) {

try {

//将配置文件加载进来

prop.load(ips);

} catch (IOException e) {

e.printStackTrace();

}

}

//创建getBean方法,通过配置文件中的名字获取bean对象

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

}

//判断bean是特殊的bean即ProxyFactoryBean还是普通的bean

if(bean instanceof ProxyFactoryBean){

Object proxy = null;

try {

//是ProxyFactoryBean的话,强转,并获取目标和通告

ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;

//获取advice和target

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

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

//设置目标和通告

proxyFactoryBean.setAdvice(advice);

proxyFactoryBean.setTarget(target);

//通过类ProxyFactoryBean(开发中是作为接口存在)中获得proxy对象

proxy = proxyFactoryBean.getProxy();

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//是ProxyFactoryBean的话,返回proxy对象

return proxy;

}

//否则返回普通bean对象

return bean;

}

}

//创建ProxyFactoryBean类

package cn.itcast.test3.aopframework;

import java.lang.reflect.*;

import cn.itcast.test3.Advice;

public class ProxyFactoryBean {

private Object target;

private Advice advice;

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;

}

public Object getProxy() {

Object proxy = Proxy.newProxyInstance(

target.getClass().getClassLoader(),

//这里的接口要和target实现相同的接口

target.getClass().getInterfaces(),

new InvocationHandler() {

public Object invoke(Object proxy, Method method, Object[] args)

throws Throwable {

//通过契约,使用其方法--before和after方法

advice.beforeMethod(method);

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

advice.afterMethod(method);

return value;

}

}

);

return proxy;

}

}

//创建测试类AopFrameworkTest

package cn.itcast.test3.aopframework;

import java.io.InputStream;

public class AopFramewrorkTest {

public static void main(String[] args)throws Exception {

//读取配置文件的数据

InputStream ips =

AopFramewrorkTest.class.getResourceAsStream("config.property");

//获取bean对象

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

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

}

}

java 实现类似spring的可配置的AOP框架的更多相关文章

  1. JAVA基础加强(张孝祥)_类加载器、分析代理类的作用与原理及AOP概念、分析JVM动态生成的类、实现类似Spring的可配置的AOP框架

    1.类加载器 ·简要介绍什么是类加载器,和类加载器的作用 ·Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader ...

  2. 56_实现类似spring的可配置的AOP框架

    > config.properties  配置文件   key=类名 > BeanFactory  Bean工厂,负责得到bean  getBean("xxx") &g ...

  3. Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架

    类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个类负责加载特定位置的类:BootStrap,ExtClassLoader,AppClassLoader 类加载器也是Jav ...

  4. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...

  5. 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置

    经过<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(1) - 数据源与事务管理>和<基于纯Java代码的Spring容器和Web容器零配置的思考和实现(2) - ...

  6. Spring学习记录(十二)---AOP理解和基于注解配置

    Spring核心之二:AOP(Aspect Oriented Programming) --- 面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...

  7. Spring 5| 轻量级的开源JavaEE框架

    一.Spring框架的概述 1.Spring是轻量级的开源的JavaEE框架 2.Spring可以解决企业应用开发的复杂性 3.Spring有两个核心的部分:IOC(控制反转)和AOP(面向切面编程) ...

  8. Spring学习(八)AOP详解

    文章更新时间:2020/04/06 一.一个例子 在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让 ...

  9. 从零开始学 Java - Spring 集成 ActiveMQ 配置(一)

    你家小区下面有没有快递柜 近两年来,我们收取快递的方式好像变了,变得我们其实并不需要见到快递小哥也能拿到自己的快递了.对,我说的就是类似快递柜.菜鸟驿站这类的代收点的出现,把我们原来快递小哥必须拿着快 ...

随机推荐

  1. linux下播放器设计和开发

    http://blog.csdn.net/henryjee/article/details/6737392 本文根据DawnLightPlayer的开发经验写成.DawnLithtPlayer是今天3 ...

  2. Directx教程(27) 简单的光照模型(6)

    原文:Directx教程(27) 简单的光照模型(6)      从myTutorialD3D11_15到myTutorialD3D11_19的工程中,我们都只有一个光源,光源的位置在LightCla ...

  3. day25 CMDB(1)

    CMDB项目介绍 参考地址: http://www.cnblogs.com/wupeiqi/articles/4556300.html http://www.cnblogs.com/wupeiqi/a ...

  4. jq获取浏览器可视窗口的高度

    <script> var window_height = $(window).height(); </script>

  5. AbstractExecutorService的submit方法概要介绍

    1.概述 ExecutorService是JDK提供的框架,它简化了异步模式下的任务执行.一般来说,ExecutorService会自动提供一个线程池和API,用于为其分配任务. 2.实例化Execu ...

  6. Gym - 101617D_Jumping Haybales(BFS)

    Sample Input 4 2 .### #... .#.. #.#. 3 1 .#. .#. .#. Sample Output 4 -1 题意:给一个n*n的图,每次最多能跳k个格子,只能向南( ...

  7. vmware中centos、redhat桥接网络配置

    第一步 第二步 第三步 centos: redhat:

  8. Microsoft.SQL.Server2012.Performance.Tuning.Cookbook学习笔记(一)

    一.Creating a trace or workload 注意点: In the Trace Properties dialog box, there is a checkbox option i ...

  9. Notepad++颜色配置

    目前看着比较顺眼的notepad++配置,记录如下:

  10. 一条数据的漫游 -- X-Engine SIGMOD Paper Introduction

    大多数人追寻永恒的家园(归宿),少数人追寻永恒的航向. ----瓦尔特.本雅明 背景 X-Engine是阿里数据库产品事业部自研的OLTP数据库存储引擎,作为自研数据库POLARDB X的存储引擎,已 ...