Spring aop--4不同的使用方式




我們經常會用到的有如下幾種

        1、基於代理的AOP

        2、純簡單java對象切面

        3@Aspect注解形式的

        4、注入形式的Aspcet切面

下面我們就一個一個來應用吧.

下面先寫一下幾個基本的類。

接口類:

<span style="font-size:18px;">/**
* 定義一個接口
* @author 陳麗娜
* @version 2015年5月31日上午9:16:50
*/
public interface Sleepable {

/**
* 睡覺方法
* @author 陳麗娜
* @version 2015年5月31日上午9:17:14
*/
void sleep();
}
</span>


實現類:

<span style="font-size:18px;">/**
* 陳麗娜 本人實現睡覺接口
* @author 陳麗娜
* @version 2015年5月31日下午4:51:43
*/
public class ChenLliNa implements Sleepable {

@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("乖,該睡覺了!");
}
}
</span>

增強類:

<span style="font-size:18px;">/**
* 定義一個睡眠的增強 同時實現前置 和后置
* @author 陳麗娜
* @version 2015年5月31日上午9:24:43
*/
public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {

@Override
public void afterReturning(Object returnValue, Method method,
Object[] args, Object target) throws Throwable {
System.out.println("睡覺前要敷面膜");
}

@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("睡覺后要做美夢");
}

}</span>

一、基於代理的AOP

<span style="font-size:18px;">   <!-- 創建一個增強 advice -->
<bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>

<bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
<!-- 定義切點 匹配所有的sleep方法-->
<bean id ="sleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value=".*sleep"></property>
</bean>

<!-- 切面 增強+切點結合 -->
<bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="sleepHelper"/>
<property name="pointcut" ref="sleepPointcut"/>
</bean>

<!-- 定義代理對象 -->
<bean id="linaProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="lina"/>
<property name="interceptorNames" value="sleepHelperAdvisor"/>
<!-- <property name="proxyInterfaces" value="com.tgb.springaop.service.Sleepable"/> -->
</bean>
</span>


如配置文件中:

pattern屬性指定了正則表達式,他匹配所有的sleep方法

使用org.springframework.aop.support.DefaultPointcutAdvisor的目的是為了使切點和增強結合起來形成一個完整的切面

最后配置完后通過org.springframework.aop.framework.ProxyFactoryBean產生一個最終的代理對象。

 

二、純簡單java對象切面

純簡單java對象切面這話怎么說呢,在我看來就是相對於第一種配置,不需要使用代理,,而是通過spring內部機制去自動掃描,這時候我們的配置文件就該如下修改:

<span style="font-size:18px;">       <!-- 創建一個增強 advice -->
<bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>
<!-- 目標類 -->
<bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>

<!-- 配置切點和通知-->
<bean id ="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="sleepHelper"></property>
<property name="pattern" value=".*sleep"/>
</bean>

<!-- 自動代理配置 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>
</span>


是不是相對於第一種簡單了許多,不用再去配置代理了。

 

三、@Aspect注解形式

根據我們的經驗也知道,注解的形式相對於配置文件是簡單一些的,這時候需要在已有的方法或類上家注解:

<span style="font-size:18px;">/**
* 通過注解的方式 添加增強
* @author 陳麗娜
* @version 2015年5月31日上午10:26:13
*/
@Aspect
@Component
public class SleepHelper03 {

/*@Pointcut("execution(* com.tgb.springaop.service.impl..*(..))")*/
@Pointcut("execution(* *.sleep(..))")
public void sleeppoint(){}

@Before("sleeppoint()")
public void beforeSleep(){
System.out.println("睡覺前要敷面膜");
}

@AfterReturning("sleeppoint()")
public void afterSleep(){
System.out.println("睡覺后要做美夢");
}
</span>

配置文件中只需寫:

<span style="font-size:18px;">  <!--掃描包 -->
<context:component-scan base-package="com.tgb" annotation-config="true"/>
<!-- ASPECTJ注解 -->
<aop:aspectj-autoproxy proxy-target-class="true" />

<!-- 目標類 -->
<bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
</span>

 

四、注入形式的Aspcet切面

個人感覺這個是最簡單的也是最常用的,也是最靈活的。配置文件如下:

<span style="font-size:18px;">   <!-- 目標類 -->
<bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
<bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper02"/>

<aop:config>
<aop:aspect ref="sleepHelper">
<aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>
<aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>
</aop:aspect>
</aop:config>
</span>

配置文件中提到的SleepHelper02類如下:

/**
* 通過注解的方式 添加增強
* @author 陳麗娜
* @version 2015年5月31日上午10:26:13
*/

public class SleepHelper02 {
public void beforeSleep(){
System.out.println("睡覺前要敷面膜");
}
public void afterSleep(){
System.out.println("睡覺后要做美夢");
}
}

 

是不是看上去都很簡單呀,這樣是不是大家都會使用spring aop了?!

 

關於如何調用,這里寫了幾個測試類,可以看一下,基本都一樣:

/**
* 配置文件 spring_aop.xml 通過代理
* @author 陳麗娜
* @version 2015年5月31日上午10:09:10
*/
@Test
public void test(){
ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop.xml");

Sleepable sleeper =(Sleepable) ct.getBean("linaProxy");

sleeper.sleep();
}

/**
* 配置文件 spring_aop_01.xml 簡答的java對象
* @author 陳麗娜
* @version 2015年5月31日上午10:09:37
*/
@Test
public void test01(){
ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_01.xml");

Sleepable sleeper = (Sleepable)ct.getBean("lina");

sleeper.sleep();
}

/**
* 配置文件 spring_aop_03.xml 通過aspect注解
* @author 陳麗娜
* @version 2015年5月31日上午10:09:37
*/
@Test
public void test03(){
ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_03.xml");

Sleepable sleeper = (Sleepable)ct.getBean("lina");

sleeper.sleep();
}
/**
* 配置文件 spring_aop_02.xml 通過apsect配置文件
* @author 陳麗娜
* @version 2015年5月31日上午10:09:37
*/
@Test
public void test02(){
ApplicationContext ct = new ClassPathXmlApplicationContext("spring_aop_02.xml");

Sleepable sleeper = (Sleepable)ct.getBean("lina");

sleeper.sleep();
}



通過測試類可以看出,不管以什么樣的方式來實現aop他們的使用都是沒有差別的,這幾個測試類的結果都是一樣的:


 



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com