|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
那这个对象有什么意义?现在很多用javabean的人就不能保证对象有完整的意义,不成熟的使用模式等导致代码疯狂增长,调试维护的时间要得多得多。在说性能之前,先说说你这个比较的来历。据说微软为了证明。net比java好。web 在WEB开辟中,用户对网页的会见权限反省是一个主要的环节。以STRUST为例,我们必要在Action的excute办法中编写相干的代码(通常为挪用基类的函数),也很明显,在每一个Action中这是一种反复休息。
假如我们在excute运转之前,可以主动往挪用基类的权限反省函数,这无疑是个好的办理举措。AOP就为我们供应了如许一种办理办法。
上面以一个简化的实例先容完成的举措。
起首我们做一个接口:
publicinterfaceCheckInterface{
publicabstractvoidcheck(Stringname);
publicabstractvoidexcute(Stringname);
}
再做一个基类:
publicabstractclassBaseClassimplementsCheckInterface{
publicBaseClass(){
}
publicvoidcheck(Stringname){
if(name.equals("supervisor"))
System.out.println("CheckPass!!");
else{
System.out.println("Noaccessprivilege!Pleasedosth.else!");
}
}
}
再做一个测试类:
publicclassExcuteClassextendsBaseClass{
publicExcuteClass(){
}
publicvoidexcute(Stringname){
System.out.println("Excutehere!"+name);
}
}
好了,上面做一个关照类(Advice):
importorg.springframework.aop.MethodBeforeAdvice;
importjava.lang.reflect.Method;
importorg.apache.log4j.Logger;
publicclassBeforeAdvisorimplementsMethodBeforeAdvice{
privatestaticLoggerlogger=Logger.getLogger(BeforeAdvisor.class);
publicvoidbefore(Methodm,Object[]args,Objecttarget)throwsThrowable{
if(targetinstanceofCheckInterface){
logger.debug("IsInstanceofCheckInterface!!!");
CheckInterfaceci=(CheckInterface)target;
ci.check((String)args[0]);
}
}
}
个中主要的before办法的参数:Objecttarget传进的关照的对象(即测试类的接口),Methodm,Object[]args分离是该对象被挪用的办法和参数。我们再来作springbean界说xml文件:
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd>
<beans>
<description>SpringQuickStart</description>
<beanid="MyAdvisor"class="com.wysm.netstar.test.springaop.BeforeAdvisor"/>
<beanid="myPointcutAdvisor2"class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<propertyname="advice">
<reflocal="MyAdvisor"/>
</property>
<propertyname="patterns">
<list>
<value>.*excute.*</value>
</list>
</property>
</bean>
<beanid="checkInterface"class="com.wysm.netstar.test.springaop.ExcuteClass"/>
<beanid="myCheckClass"class="org.springframework.aop.framework.ProxyFactoryBean">
<propertyname="proxyInterfaces">
<value>com.wysm.netstar.test.springaop.CheckInterface</value>
</property>
<propertyname="target">
<reflocal="checkInterface"/>
</property>
<propertyname="interceptorNames">
<value>myPointcutAdvisor2</value>
</property>
</bean>
</beans>
这个界说文件指了然ExcuteClass为监督对象,它的excute办法被实行的时分,BeforeAdvisor将被挪用。
最初是测试类:
importjunit.framework.TestCase;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.FileSystemXmlApplicationContext;
publicclassSpringTestCase2extendsTestCase{
CheckInterfacetest=null;
protectedvoidsetUp()throwsException{
super.setUp();
ApplicationContextctx=newFileSystemXmlApplicationContext("src/com/wysm/netstar/test/springaop/aoptest.xml");
test=(CheckInterface)ctx.getBean("myCheckClass");
}
protectedvoidtearDown()throwsException{
super.tearDown();
}
publicvoidtestExcute(){
test.excute("supervisor");
}
}
令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。 |
|