您的位置:首页 > 编程语言 > Java开发

Spring AOP 架构

2013-07-16 17:14 246 查看
Spring AOP 架构

Spring AOP 架构的核心是建立在代理上的。Spring 内部有两种实现代理的方法:JDK动态代理和CGLIB代理。

1 Spring 中的联结点

Spring 只支持一种联结点:方法调用。

2 Spring 中的方面

在Spring AOP 中,一个方面是由一个实现了Advisor(通知者)接口的类表示的。两个子接口:

IntroductionAdvisor 引入通知者(控制对哪些类实施引入)

PointcutAdvisor 切入点通知者

3 关于ProxyFactory 类

ProxyFactory 类控制着Spring AOP中的织入和创建代理的过程,控制哪些方面需要织入到代理中去。

4 在 Spring 中创建通知

Spring 支持五种通知:

前置通知 MethodBeforeAdvice

后置通知 AfterReturningAdvice

包围通知 MethodInterceptor

抛出通知 ThrowAdvice

引    入 IntroductionInterceptor

示例程序说明:

演示前置通知与后置通知

package cuigh.spring.aop.step01;

/*

 * 功能:演示在代理类中是否可以知道参数的类型

 * */

public class User {

String name;

int age;

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 cuigh.spring.aop.step01;

/*

 * 功能:目标类

 * */

public class MessageWriter {

public void writeMessage(String name){

System.out.print(" World ");

}

public void writeMessage2(User user){

System.out.print("World 2 ");

}

}

package cuigh.spring.aop.step01;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class MyBeforeAdvice implements MethodBeforeAdvice {

/**

 * 功能:前置通知

 */

@Override

public void before(Method method, Object[] args, Object target)

throws Throwable {

System.out.println("方法执行前通知,方法名称="+method.getName()+"\n");

System.out.println("参数类型="+args[0].getClass().getName());

}

}

package cuigh.spring.aop.step01;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

/**

 * 功能:后置通知

 */

public class MyAfterReturningAdvice implements AfterReturningAdvice {

@Override

public void afterReturning(Object returnValue, Method method,

Object[] args, Object target) throws Throwable {

System.out.println("方法执行后增加逻辑,方法名="+method.getName());

}

}

package cuigh.spring.aop.step01;

import org.springframework.aop.framework.ProxyFactory;

public class AdviceExample {

/**

 * 功能:演示前置、后置通知

 */

public static void main(String[] args) {

//创建目标类与通知类

MessageWriter target = new MessageWriter();

MyBeforeAdvice advice = new MyBeforeAdvice();

ProxyFactory pf = new ProxyFactory();

pf.addAdvice(advice);

pf.setTarget(target);

MessageWriter proxy = (MessageWriter)pf.getProxy();

proxy.writeMessage("zhang");

System.out.println("\n--------------");

<
bb9d
span style="color:#000000;">proxy.writeMessage2(new User());

System.out.println("增加方法执行后的逻辑-------------------");

//创建第二个通知类

MyAfterReturningAdvice advice2 = new MyAfterReturningAdvice();

pf.addAdvice(advice2);

proxy.writeMessage("after");

}

}

程序输出:

方法执行前通知,方法名称=writeMessage

参数类型=java.lang.String

 World 

--------------

方法执行前通知,方法名称=writeMessage2

参数类型=cuigh.spring.aop.step01.User

World 2 增加方法执行后的逻辑-------------------

方法执行前通知,方法名称=writeMessage

参数类型=java.lang.String

 World 方法执行后增加逻辑,方法名=writeMessage
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: