一、工厂类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());

}

}

转载于:https://www.cnblogs.com/fanweisheng/p/11137873.html

java 实现类似spring的可配置的AOP框架相关推荐

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

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

  2. 通过实例理解Spring的Bean工厂和AOP框架

    一.需求设想 现在我有一个配置文件,里面配置了Bean的相关信息,如bean的类名(包括包名).代理工厂(主要负责产生代理类).目标类(被代理的类).业务织入接口(Advice).然后通过BeanFa ...

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

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

  4. Spring总结(IOC、AOP原理以及Spring事务)

    一.概述 1.Spring是一个开源免费且轻量级的框架 , 非侵入式的 . 2.控制反转 IoC , 面向切面 Aop 3 .对事物的支持 , 对框架的支持 一句话概括: Spring 是一个轻量级的 ...

  5. Spring学习(八)AOP详解

    本文借鉴:Spring学习 一.一个例子 在上面的例子中,包租婆的核心业务就是签合同,收房租,那么这就够了,灰色框起来的部分都是重复且边缘的事,交给中介商就好了,这就是 AOP 的一个思想:让关注点代 ...

  6. java spring多数据源配置文件_深入理解spring多数据源配置

    项目中我们经常会遇到多数据源的问题,尤其是数据同步或定时任务等项目更是如此.多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源.例如在一个spring和hibernate的框架的 ...

  7. 玩转Spring Cloud之配置中心(config server config client)

    玩转Spring Cloud之配置中心(config server &config client)  本文内容导航: 一.搭建配置服务中心(config server) 1.1.git方式 1 ...

  8. [Java面试五]Spring总结以及在面试中的一些问题.

    2019独角兽企业重金招聘Python工程师标准>>> 1.谈谈你对spring IOC和DI的理解,它们有什么区别? IoC Inverse of Control 反转控制的概念, ...

  9. @scheduled注解配置时间_探究 Spring 的定时任务配置

    作者 | 郭朝兴 责编 | Elle 最近在项目开发中进行了一些Spring定时任务的开发工作,在开发过程中对Spring定时任务的配置方式进行了一些研究,现在对各种配置方式进行一个总结.Schedu ...

  10. Spring Security 2 配置精讲

    论坛上看了不少Spring Security的相关文章.这些文章基本上都还是基于Acegi-1.X的配置方式,而主要的配置示例也来自于SpringSide的贡献. 众所周知,Spring Securi ...

最新文章

  1. iOS-ARC_Xcode检测循环引用
  2. mysql 中 replace into 与 insert into on duplicate key update 的使用和不同点
  3. MySQL 触发器错误
  4. ajax可以在localhost上用吗_你还不知道跨域问题是怎样造成的吗?
  5. 用台式机搭建服务器测试环境_2020年十大最佳台式机环境
  6. from xx is not a valid DFS filename
  7. Adhesive框架系列文章--报警服务使用实践
  8. Internet路由之路由表查找算法概述-哈希/LC-Trie树/256-way-mtrie树
  9. 压缩与解压2---文件的压缩
  10. General Mission Analysis Tool (GMAT)学习
  11. 信息学奥赛系列教程:C++程序基本结构
  12. oracle备份数据exp,oracle数据库备份之exp增量备份
  13. 如何用tomcat模拟集群,要求负载均衡(Nginx),并保持session一致性!
  14. 转载 关于12360系统的讨论
  15. 自由 stm32f103c8t6芯片学习原理图+中文数据手册pdf
  16. 灰度值阈值设置matlab,基本全局阈值法(basic global thresholding)MATLAB实现
  17. BT Dongle设计介绍
  18. 4G--水控机物联网版本多个出水口---完善中
  19. Neo4j 系列(1) —— 初识 Neo4j
  20. RabbitMQ(消息队列)私人学习笔记

热门文章

  1. 原来查询语句还有这功能,累计变量值
  2. 学英语怎样才能事半功倍
  3. 华为WLAN产品命名规范
  4. vue2.0项目的环境配置以及有哪些的坑
  5. 如何用阿里云服务器建立一个wordpress网站
  6. java之方法覆盖的坑
  7. 基于httpd的mod_deflate模块
  8. 手把手玩转win8开发系列课程(9)
  9. Oracle生成流水号函数
  10. org.jgroups.ChannelException: failed to start p...