快捷搜索:

Spring 的AOP(面向切面编程)

AOP 是一门编程技巧, spring 的 AOP 可以这样理解:把非核心代码从核心代码块中提掏出来,经由过程 Spring 达到一种即插即用的效果。普通点来说也便是,假如履行措施 1 之前必须要履行一个或多个其他非该功能的一些措施,假如按传统的开拓模式,则在措施 1 的前面写几条调用语句,这样做有有好处也有坏处,好处便是假如法度榜样代码量少那么可以很清楚明了的指示这些措施之间的一个关系,但假如法度榜样对照繁杂代码量很大年夜的坏,那么该功能模块中势必会参杂很多非核心的一些代码组件在里面,使代码看起来很复杂,经由过程 Spring 的 AOP 技巧能对此进行改良代码,让非核心的代码经由过程 Spring 来插入到某个切面上(或者说是某个履行点上),这样核心代码就显得更简洁,非核心的代码或组件就不会参杂在里面了 ;

AOP 的观点对照抽象,但只要记着 3 个核心观点就行:

a.Advice :是指向核心法度榜样内部注入的代码;比如日志记录或者其他非核心的代码

b.PointCut :是指 Advice 注入的一个切面,也便是上面的所谓的核心代码快,平日是一些 public 的措施( Advice 便是插入到 PointCut 代码的前面或后面);

c.Advisor :是指 Advice 和 PointCut 的组装者,它是实际的将 Advice 代码注入到 PointCut 代码的操作代码。

以下代码是一个简单的运用了 AOP 编程:

接口:

package theInterface;

public interface Bean {

public void theMethod();

}

实现类:

package impl;

import theInterface.Bean;

public class BeanImpl implements Bean {

public void theMethod() {

System. out .println( “履行的核心代码:” +

this .getClass().getName() + " says HELLO!" );

}

}

定义一个 Advice 代码,该代码实现 Spring 的 MethodBeforeAdvice 接口,它有一个措施必须实现,该措施是在 PointCut 代码之前调用(看名字可知意):

留意:可能有人写好这个类后 Eclipse 提示要求 Configure build path… 那么很可能还少一个包: aopalliance-1.0.jar ,这个包在 Spring 包中没有,但运行的时刻又必须有,以是 Eclipse 会提示导包。

这个包可在我资本里面下载

package impl;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

留意下面的措施中的 Method m 表示必要注入其他代码的措施,也便是实际类的核心代码,可用于进行判断是否必要履行下面的注入代码 ,args 表示措施的参数数组 ,target 表示措施所在类工具

public class TestBeforeAdvice implements MethodBeforeAdvice{

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

throws Throwable {

System. out .println( " 必要注入的代码: "

+ this .getClass().getName() + ")" );

}

}

下面定义 Spring 的设置设置设备摆设摆设文件:

xml version = "1.0" encoding = "UTF-8" ?>

beans

xmlns = "http://www.springframework.org/schema/beans"

xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd" >

bean id = "beanTarget" class = "impl.BeanImpl" />

bean id = "bean" class = "org.springframework.aop.framework.ProxyFactoryBean" >

property name = " proxyInterfaces " >

value > theInterface.Beanvalue >

property >

property name = "target" >

ref local = "beanTarget" />

property >

property name = "interceptorNames" >

list >

value > theAdvisorvalue >

list >

property >

bean >

bean id = "theAdvisor" class = "org.springframework.aop.support. RegexpMethodPointcutAdvisor " >

property name = "advice" >

ref local = "theBeforeAdvice" />

property >

property name = "pattern" >

value > theInterface\.Bean\.theMethodvalue >

property >

bean >

bean id = "theBeforeAdvice" class = "impl.TestBeforeAdvice" />

beans >

留意:

1.这几个的顺序无所谓,由于法度榜样是先把设置设置设备摆设摆设信息整个载入,然后在根据必要进行组装

2.上面设置设置设备摆设摆设了一个名为“ theBeforeAdvice ”的 Advice ,包孕了正则表达式的 PointCut 的 Advisor.

3.Advisor 经由过程 spring 的 RegexpMethodPointcutAdvisor 类来实现,他定义了一个名为 advice 的标签,该标签供给 Advice 所必要的类;他还定义了一个名为 pattern 的标签,该标签是 PointCut 表示的措施。

4.设置设置设备摆设摆设文件同时还设置设置设备摆设摆设了一个工厂 Bean ,它是经由过程 ProxyFactoryBean 来实现的;

a.proxyInterfaces 定义了接口类;

b.target 定义了接口的实现类;

c.interceptorNames 表示值列表属性,这个列表表示不要在 target 上履行的 Advisor 。留意:必须斟酌他们的履行顺序。

您可能还会对下面的文章感兴趣: