標籤:style http io 使用 java ar for 檔案 div
實作類別似spring的可配置的AOP架構
從源頭上說 aop總共有那麼幾種方法
1.用AspectJ,這需要引入該文法的編譯器,但是功能最強大,spring貌似有對其提供支援或者封裝,用spring可以不用引入AspectJ編譯器直接是用Annotation來是用aspectJ的aop功能。
2.是用asm或apache commons項目的BCEL包直接操作class檔案,如。spring中需要引入asm包,所以裡面肯定有引用該功能的地方。如Hibernate即是使用該包實現實體映射
工廠類BeanFactory負責建立目標類或代理類的執行個體對象,並通過設定檔實現切換。其getBean方法根據參數字串返回一個相應的執行個體對象,如果參數字串在設定檔中對應的類名不是ProxyFactoryBean,則直接返回該類的執行個體對象,否則,返回該類執行個體對象的getProxy方法返回的對象。
BeanFactory的構造方法接收代表設定檔的輸入資料流對象,設定檔格式如下:
#xxx=java.util.ArrayList
xxx=cn.itcast.ProxyFactoryBean
xxx.target=java.util.ArrayList
xxx.advice=cn.itcast.MyAdvice
ProxyFacotryBean充當封裝產生動態代理的工廠,需要為工廠類提供哪些配置參數資訊?
目標
通知
編寫用戶端應用:
編寫實現Advice介面的類和在設定檔中進行配置
調用BeanFactory擷取對象
樣本:
ProxyFactoryBean.java
package com.itheima.day3.aopframework;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import com.itheima.day3.Advice;
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() {
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
advice .beforeAdvice(method);
Object retVal = method.invoke( target ,args);
advice .afterAdvice(method);
return retVal;
}
}
);
return proxy;
};
}
BeanFactory.java
package com.itheima.day3.aopframework;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import com.itheima.day3.Advice;
publicclassBeanFactory {
Propertiesprops=newProperties();
publicBeanFactory(InputStream ips){
try{
props.load(ips);
}catch(IOException e) {
e.printStackTrace();
}
}
publicObject getBean(String name) {
String className =props.getProperty(name);
Object bean =null;
try{
Class clazz = Class.forName(className);
bean = clazz.newInstance();
}catch(Exception e) {
e.printStackTrace();
}
if(beaninstanceofProxyFactoryBean){
ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;
Object proxy =null;
try{
Advice advice = (Advice) Class. forName(
props.getProperty(name +".advice")).newInstance();
Object target = Class. forName(
props.getProperty(name +".target")).newInstance();
proxyFactoryBean.setAdvice(advice);
proxyFactoryBean.setTarget(target);
proxy = proxyFactoryBean.getProxy();
}catch(Exception e) {
e.printStackTrace();
}
returnproxy;
}
returnbean;
}
}
AopFrameworkTest.java
package com.itheima.day3.aopframework;
import java.io.InputStream;
publicclassAopFrameworkTest {
publicstaticvoidmain(String[] args)throwsException{
InputStream ips = AopFrameworkTest.class.getResourceAsStream("config.properties");
Object bean =newBeanFactory(ips).getBean("xxx");
System.out.println(bean.getClass().getName());
}
}
詳情請查看:http://edu.csdn.net/heima
黑馬程式員——高新技術