首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

spring(三):spring的AOP

2012-10-16 
spring(3):spring的AOP????1???????下面看具体的例子:定义Person接口,声明两个方法package leepublic int

spring(3):spring的AOP

spring(三):spring的AOP

?

spring(三):spring的AOP

?

spring(三):spring的AOP

?

spring(三):spring的AOP

?

spring(三):spring的AOP

1

?spring(三):spring的AOP

?

spring(三):spring的AOP

?

spring(三):spring的AOP

?

spring(三):spring的AOP

?

spring(三):spring的AOP

?

?

下面看具体的例子:

定义Person接口,声明两个方法

package lee;public interface Person {void info();void run();}

?

具体的实现类

package lee;public class PersonImpl implements Person {private String name;private int age;public void info() {System.out.println("我的名字是:"+name+",今年年龄为:"+age);}public void run() {if(age > 45){System.out.println("我年老体弱,只能慢跑");}else{System.out.println("我年轻体壮,可以快跑");}}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}

?

下面定义三个拦截器

package lee;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class MyBeforeAdvisor implements MethodBeforeAdvice {public void before(Method m, Object[] arg, Object target)throws Throwable {System.out.println("方法调用前...");System.out.println("下面是方法调用的信息...");System.out.println("所执行的方法是..."+m);System.out.println("调用方法的参数是..."+arg);System.out.println("目标对象是..."+target);}}

?

package lee;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;public class MyAroundInterceptor implements MethodInterceptor {public Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("调用方法之前:invocation对象:["+invocation+"]");Object rval = invocation.proceed();System.out.println("调用结束...");return rval;}}

?

package lee;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;public class MyAfterAdvisor implements AfterReturningAdvice {public void afterReturning(Object returnValue, Method m, Object[] args,Object target) throws Throwable {System.out.println("方法调用结束...");System.out.println("目标方法的返回值是:..."+returnValue);System.out.println("目标方法是..."+m);System.out.println("目标方法的参数是..."+args);System.out.println("目标对象是..."+target);}}

?

spring配置文件

<bean id="personTarget" name="code">package lee;import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.core.io.ClassPathResource;public class BeanTest {public static void main(String[] args) {XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));Person p = (Person)factory.getBean("person");p.run();}}

?最后打印出

方法调用前...下面是方法调用的信息...所执行的方法是...public abstract void lee.Person.run()调用方法的参数是...[Ljava.lang.Object;@184ec44目标对象是...lee.PersonImpl@1b383e9调用方法之前:invocation对象:[ReflectiveMethodInvocation: public abstract void lee.Person.run(); target is of class [lee.PersonImpl]]我年老体弱,只能慢跑调用结束...方法调用结束...目标方法的返回值是:...null目标方法是...public abstract void lee.Person.run()目标方法的参数是...[Ljava.lang.Object;@99681b目标对象是...lee.PersonImpl@1b383e9

?

下面再看一个权限校验的例子:

package permission;public interface TestService {void view();void modify();}

?

?

package permission;public class TestServiceImpl implements TestService {public void modify() {System.out.println("用户修改数据");}public void view() {System.out.println("用户查看数据");}}

?

?

package permission;public interface TestAction {public void view();public void modify();}

?

?

package permission;public class TestActionImpl implements TestAction {private TestService ts;public void modify() {ts.modify();}public void view() {ts.view();}public void setTs(TestService ts) {this.ts = ts;}}

?

拦截类,这个类中会进行验权

package permission;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;public class AuthorityInterceptor implements MethodInterceptor {private String user;public void setUser(String user) {this.user = user;}public Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("-------------------------");String methodName = invocation.getMethod().getName();if(!user.equals("admin") && !user.equals("registedUser")){System.out.println("你无权执行该方法");return null;}else if(user.equals("registedUser") && methodName.equals("modify")){System.out.println("你不是管理员,无法修改数据");return null;}else {return invocation.proceed();}}}

?

spring中的配置文件

<bean id="serviceTarget" name="code">package permission;import org.springframework.beans.factory.xml.XmlBeanFactory;import org.springframework.core.io.ClassPathResource;public class BeanTest {public static void main(String[] args) {XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));TestAction ta = (TestAction)factory.getBean("testAction");ta.modify();ta.view();}}

?结果打印:

-------------------------你不是管理员,无法修改数据-------------------------用户查看数据

?

这个例子属于功能增强的概念,将验权功能植入action类中。

如果没有接口,只有具体类应该怎么做?如只有TestServiceImpl类,没有TestService接口,那么应该如何拦截,

可在spring配置文件中将设置一个属性proxyTargetClass,将其值设为true,表示目标类是个具体类,如下粗体所示。

?

<bean id="service" class="org.springframework.aop.framework.ProxyFactoryBean">           <property name="proxyTargetClass">         <value>true</value>          </property><property name="target"><ref local="serviceTarget"/></property><property name="interceptorNames"><list><value>authorityInterceptor</value></list></property></bean>

?

热点排行