p { margin-bottom: 0.21cm; }
此框架实现了再配置文件里面配置一个对象是否使用代理
类说明
-
ProxyFactoryBean 类是得到 Proxy 对象
-
BeanFactory 类是得到配置文件中的配置信息
-
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
-
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;
}
}
-
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;
}
}
-
调用方法
// 调用 aop 框架 传入一个输入流
InputStream ins = AopFrameworkTest. class .getResourceAsStream( "config.properties" );
// 指定配置文件中属性名 得到返回对象 准备调用
Object bean = new BeanFactory(ins).getBean( "xxx" );
System. out .println(bean.getClass().getName());
((Collection)bean).clear();