11.6实现一个类似于spring的可配置的AOP框架

p { margin-bottom: 0.21cm; }

此框架实现了再配置文件里面配置一个对象是否使用代理

类说明

  1. ProxyFactoryBean 类是得到 Proxy 对象

  2. BeanFactory 类是得到配置文件中的配置信息

  3. Advice 接口为通知接口

 

配置文件配置方法

对象名(随便命名) 配置实体对象 如果没有代理对象就直接写上实体对象

对象名 . advice 配置 advice 即配置通知类 通知类需要实现 advice 接口

对象名 . target 配置返回类 即实体对象

实例

#xxx=java.util.ArrayList

xxx= cn.itcast.day3.aopframework.ProxyFactoryBean

xxx.advice= cn.itcast.day3.MyAdvice

xxx.target= java.util.ArrayList

 

  1. ProxyFactoryBean

 

public class ProxyFactoryBean {

// 建议接口(通知接口 可以自己添加通知)

private Advice advice ;

// 返回对象(实体对象)

private Object target ;

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;

}

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 .afterMethod(method);

// 执行对象的方法 使用的反射技术

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

// 后置通知

advice .beforMethod(method);

return reVal;

}

 

});

return proxy;

}

}

 

  1. BeanFactory

public class BeanFactory {

Properties properties = new Properties();

public BeanFactory(InputStream in) {

try {

properties .load(in);

} catch (Exception 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 (Exception e) {

e.printStackTrace();

}

// 判断在配置文件中是否配置代理类 如果配置了代理类 bean 就为 ProxyFactoryBean 如果没配置代理类 bean 就为实体对象 即“返回对象 target”

if (bean instanceof ProxyFactoryBean){

Object proxy = null ;

ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;

try {

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

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

proxyFactoryBean.setAdvice(advice);

proxyFactoryBean.setTarget(target);

proxy = proxyFactoryBean.getProxy();

} catch (Exception e) {

e.printStackTrace();

}

return proxy;

}

return bean;

}

}

 

  1. 调用方法

// 调用 aop 框架 传入一个输入流

InputStream ins = AopFrameworkTest. class .getResourceAsStream( "config.properties" );

// 指定配置文件中属性名 得到返回对象 准备调用

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

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

((Collection)bean).clear();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值