实验15 AOP技术.docx
- 文档编号:28706200
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:13
- 大小:275.27KB
实验15 AOP技术.docx
《实验15 AOP技术.docx》由会员分享,可在线阅读,更多相关《实验15 AOP技术.docx(13页珍藏版)》请在冰豆网上搜索。
实验15AOP技术
实验15AOP
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
publicclassBeanFactory{
privateMap
publicvoidinit(Stringxml){
try{
//读取指定的配置文件
SAXReaderreader=newSAXReader();
ClassLoaderclassLoader=Thread.currentThread()
.getContextClassLoader();
InputStreamins=classLoader.getResourceAsStream(xml);
Documentdoc=reader.read(ins);
Elementroot=doc.getRootElement();
Elementfoo;
//创建AOP处理器
AopHandleraopHandler=newAopHandler();
//遍历bean
for(Iteratori=root.elementIterator("bean");i.hasNext();){
foo=(Element)i.next();
//获取bean的属性id、class、aop以及aopType
Attributeid=foo.attribute("id");
Attributecls=foo.attribute("class");
Attributeaop=foo.attribute("aop");
AttributeaopType=foo.attribute("aopType");
//配置了aop和aopType属性时,需进行拦截操作
if(aop!
=null&&aopType!
=null){
//根据aop字符串获取对应的类
ClassadvisorCls=Class.forName(aop.getText());
//创建该类的对象
Advisoradvisor=(Advisor)advisorCls.newInstance();
//根据aopType的类型来设置前置或后置顾问
if("before".equals(aopType.getText())){
aopHandler.setBeforeAdvisor(advisor);
}elseif("after".equals(aopType.getText())){
aopHandler.setAfterAdvisor(advisor);
}
}
//利用Java反射机制,通过class的名称获取Class对象
Classbean=Class.forName(cls.getText());
//获取对应class的信息
java.beans.BeanInfoinfo=java.beans.Introspector
.getBeanInfo(bean);
//获取其属性描述
java.beans.PropertyDescriptor[]pd=info
.getPropertyDescriptors();
//设置值的方法
MethodmSet=null;
//创建一个对象
Objectobj=bean.newInstance();
//遍历该bean的property属性
for(Iteratorite=foo.elementIterator("property");ite
.hasNext();){
Elementfoo2=(Element)ite.next();
//获取该property的name属性
Attributename=foo2.attribute("name");
Stringvalue=null;
//获取该property的子元素value的值
for(Iteratorite1=foo2.elementIterator("value");ite1
.hasNext();){
Elementnode=(Element)ite1.next();
value=node.getText();
break;
}
for(intk=0;k if(pd[k].getName().equalsIgnoreCase(name.getText())){ mSet=pd[k].getWriteMethod(); //利用Java的反射机制调用对象的某个set方法,并将值设置进去 mSet.invoke(obj,value); } } } //为对象增加前置或后置顾问 obj=(Object)aopHandler.setObject(obj); //将对象放入beanMap中,其中key为id值,value为对象 beanMap.put(id.getText(),obj); } }catch(Exceptione){ System.out.println(e.toString()); } } /** *通过bean的id获取bean的对象. * *@parambeanName *bean的id *@return返回对应对象 */ publicObjectgetBean(StringbeanName){ Objectobj=beanMap.get(beanName); returnobj; } /** *测试方法. * *@paramargs */ publicstaticvoidmain(String[]args){ BeanFactoryfactory=newBeanFactory(); factory.init("config.xml"); BusinessObjobj=(BusinessObj)factory.getBean("businessObj"); obj.process(); } } packageorg.springaop.proxy; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; /** *AOP处理器. *@authordinghui *@Creationdate: 2008-9-16 */ publicclassAopHandlerimplementsInvocationHandler{ //需要代理的目标对象 privateObjecttarget; //方法前置顾问 AdvisorbeforeAdvisor; //方法后置顾问 AdvisorafterAdvisor; /** *设置代理目标对象,并生成动态代理对象. * *@paramtarget代理目标对象 *@return返回动态代理对象 */ publicObjectsetObject(Objecttarget){ //设置代理目标对象 this.target=target; //根据代理目标对象生成动态代理对象 Objectobj=Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),this); returnobj; } /** *若定义了前置处理,则在方法执行前执行前置处理,若定义了后置处理,则在方法调用后调用后置处理. * *@paramproxy *代理对象 *@parammethod *调用的业务方法 *@paramargs *方法的参数 *@return返回结果信息 *@throwsThrowable */ publicObjectinvoke(Objectproxy,Methodmethod,Object[]args) throwsThrowable{ //进行业务方法的前置处理 if(beforeAdvisor! =null){ beforeAdvisor.doInAdvisor(proxy,method,args); } //执行业务方法(反射机制) Objectresult=method.invoke(target,args); //进行业务方法的后置处理 if(afterAdvisor! =null){ afterAdvisor.doInAdvisor(proxy,method,args); } //返回结果对象 returnresult; } /** *设置方法的前置顾问. * *@paramadvisor *方法的前置顾问 */ publicvoidsetBeforeAdvisor(Advisoradvisor){ this.beforeAdvisor=advisor; } /** *设置方法的后置顾问. * *@paramadvisor *方法的后置顾问 */ publicvoidsetAfterAdvisor(Advisoradvisor){ this.afterAdvisor=advisor; } } 实验14工厂模式与IOC 一、工厂模式 根据架构图实现下列工厂模式 二、IOC实现形式: (完成下列的IOC各种注入,考试考其中的一种) 完成工厂模式注入 1、工厂模式实现IOC 2、其他模式实现IOC 完成构造器模式注入 构造器注入: 练习: 使用工厂模式注入实现下列方式: animal为接口(吃的方法,叫的方式) dogpig为(狗吃;猪吃什么) animalfactory test类
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验15 AOP技术 实验 15 AOP 技术