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

来源:互联网 发布:波兰计算器c语言 编辑:程序博客网 时间:2024/06/03 17:58

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

 

publicclassProxyFactoryBean{

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

privateAdvice advice;

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

privateObject target;

publicAdvice getAdvice() {

returnadvice;

}

publicvoidsetAdvice(Advice advice) {

this.advice= advice;

}

publicObject getTarget() {

returntarget;

}

publicvoidsetTarget(Object target) {

this.target= target;

}

public Object getProxy() {

Objectproxy = Proxy.newProxyInstance(

target.getClass().getClassLoader()

,target.getClass().getInterfaces(),

newInvocationHandler() {

@Override

publicObject invoke(Object proxy, Method method,

Object[]args) throwsThrowable {

//前置通告

advice.afterMethod(method);

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

ObjectreVal = method.invoke(target,args);

//后置通知

advice.beforMethod(method);

returnreVal;

}

 

});

returnproxy;

}

}

 

  1. BeanFactory

publicclassBeanFactory {

Propertiesproperties= newProperties();

publicBeanFactory(InputStream in) {

try{

properties.load(in);

}catch(Exception e) {

e.printStackTrace();

}

}

/**

*判断是否配置了代理类 如果配置了代理类 就返回代理类 如果没有配置代理类 就直接返回实体类“返回对象”

**/

publicObject getBean(String name){

StringclassName = properties.getProperty(name);

Objectbean = null;

try{

Classclazz = Class.forName(className);

bean= clazz.newInstance();

}catch(Exception e) {

e.printStackTrace();

}

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

if(beaninstanceofProxyFactoryBean){

Objectproxy = null;

ProxyFactoryBeanproxyFactoryBean = (ProxyFactoryBean)bean;

try{

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

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

proxyFactoryBean.setAdvice(advice);

proxyFactoryBean.setTarget(target);

proxy= proxyFactoryBean.getProxy();

}catch(Exception e) {

e.printStackTrace();

}

returnproxy;

}

returnbean;

}

}

 

  1. 调用方法

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

InputStreamins =AopFrameworkTest.class.getResourceAsStream("config.properties");

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

Objectbean = newBeanFactory(ins).getBean("xxx");

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

((Collection)bean).clear();