import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* 实体工厂类
* @author Administrator
*
*/
public class BeanFactory {
public static Object getBean(String id) {
//通过id获取一个指定的实现类
try {
//获取document对象
Document doc=new SAXReader().read(BeanFactory.class.getClassLoader().getResourceAsStream("beans.xml"));
//获取指定的bean对象
Element ele=(Element) doc.selectSingleNode("//bean[@id='"+id+"']");
//获取bean对象的class属性
String value=ele.attributeValue("class");
//反射--以前的逻辑 直接返回的是实例
//return Class.forName(value).newInstance();
//现在对service中方法进行加强 返回值的是代理对象
final Object obj = Class.forName(value).newInstance();
//是service的实现例
if(id.endsWith("Service")) {
Object proxyobj= Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//继续判断是否调动了add方法获取regist
if("add".equals(method.getName())||"regist".equals(method.getName())) {
System.out.println("添加操作");
return method.invoke(obj, args);
}
return method.invoke(obj, args);
}
});
//若是service方法 返回的是代理对象
return proxyobj;
}
return obj;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
System.out.println(getBean("ProductDao"));
}
}
备注:由于个人原因,本博客暂停更新。如有问题可联系本人,本人提供技术指导、学习方向、学习路线。本人微信wlp1156107728(添加注明来意) QQ1156107728(添加注明来意)
AOP
最新推荐文章于 2022-04-23 17:27:09 发布