Spring基於註解的AOP測試
本文是一個簡單的基於註解的AOP測試例子。本文中的例子在不使用AOP時正常用於輸出一句“I want make a friend with you.”。使用AOP後對返回的訊息在中間進行了強制修改,最後輸出為“I want fuck you!”的字樣。就比如好好的一封情書,在傳遞過程中被人篡改,變成了一句很汙的話,寫情書的人形象全毀了,但是它卻不知道。而這個篡改資訊的就是AOP。
1、正常的業務處理
原來的情書原始碼如下,在這個類中返回了一句"我想和你交個朋友"的話語。
package cn.landsem.handler;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;
@Component
public class BusinessHandler {
private Logger logger = Logger.getLogger(BusinessHandler.class);
public String say() {
logger.info("I want make a friend with you.");
return "I want make a friend with you.";
}
}
2、AOP
AOP是個壞人,它悄悄監視了BusinessHandler的動作,並攔截和篡改了它寫的情書,將它要說的話改成了“我想操你!”。原始碼如下:
package cn.landsem.aop;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class BusinessAop {
@SuppressWarnings("unused")
private Logger logger = Logger.getLogger(BusinessAop.class);
@Pointcut("execution(** cn.landsem.handler.BusinessHandler.say(..))")
public void cutpoint(){}
@Around("cutpoint()")
public String test(ProceedingJoinPoint jp) throws Throwable {
jp.proceed();
return "I want fuck you!";
}
}
當然本例中的AOP還呼叫了jp.proceed();將控制權交給了正常的業務處理,即還是讓他來寫一會,之後不顧情面修改了返回的內容。實際使用中這裡可以呼叫其他的方法或者乾脆啥也不幹。3、java的配置類
在java類中配置AOP以及完成bean的自動掃描,原始碼如下:
package cn.landsem.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import cn.landsem.aop.BusinessAop;
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("cn.landsem.handler")
public class RootConfiguration {
@Bean
public BusinessAop businessAop() {
return new BusinessAop();
}
}
4、測試用例
測試用例如下:
package cn.landsem.aop;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import cn.landsem.configuration.RootConfiguration;
import cn.landsem.handler.BusinessHandler;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RootConfiguration.class})
@WebAppConfiguration
public class BaseTest {
private Logger logger = Logger.getLogger(BaseTest.class);
@Autowired
private BusinessHandler mHandler;
@Test
public void test() {
logger.info(mHandler.say());
}
}
注意:
如果在執行時出現瞭如下的錯誤:
::0 can't find referenced pointcut
這個並不是由於程式碼有問題,而是由於開發環境中以來的jar包版本不匹配導致,可以參考http://tonydzl-2008.iteye.com/blog/2176653中給出的解決方法修改使用對應的jar包即可。
本文中的配置方法如下:
(1)、在MyEclipse中選中工程使用alt+Enter快捷鍵開啟屬性,選擇Java compiler,修改使用的jdk版本(本文使用了1.7的版本);
(2)、在maven的pom.xml檔案中修改如下依賴的jar版本(本文使用1.7.3的版本):
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.7.3</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.7.3</version>
</dependency>
相關文章
- Spring基於註解的aop配置Spring
- Spring Aop基於註解的實現Spring
- Spring中基於註解方式的AOP操作Spring
- Spring AOP的AspectJ註解Spring
- spring上 -基於註解配置bean,動態代理,AOP筆記SpringBean筆記
- spring 05 aop_註解Spring
- 基於註解的 Spring MVC詳解SpringMVC
- Spring基於註解的IoC配置Spring
- Spring(5、基於註解的事物)Spring
- Spring 註解方式實現的AOPSpring
- 基於AOP的MVP框架(三)GoMVP進階註解MVP框架Go
- 基於AOP的MVP框架(二)GoMVP進階註解MVP框架Go
- Spring5(七)——AOP註解Spring
- Spring-Aop註解形式案例Spring
- Spring Boot系列十八 Spring AOP + 註解實現統一註解Spring Boot
- Spring7:基於註解的Spring MVC(下篇)SpringMVC
- Spring6:基於註解的Spring MVC(上篇)SpringMVC
- Spring AOP單元測試綜合指南Spring
- Spring7——開發基於註解形式的springSpring
- Spring中基於XML方式的AOP操作SpringXML
- Spring AOP基於xml的方式實現SpringXML
- 死磕Spring之AOP篇 - Spring AOP註解驅動與XML配置SpringXML
- 基於Spring-AOP的自定義分片工具Spring
- 基於SpringBoot 、AOP與自定義註解轉義字典值Spring Boot
- Spring第9天Aop簡介,Aopxml開發,Aop註解開發SpringXML
- spring基於註解配置實現事務控制Spring
- Spring學習筆記2(IOC註解方式&AOP)Spring筆記
- 通過 Spring AOP 註解實現自動代理Spring
- Java Web之基於註解的Spring MVC環境配置JavaWebSpringMVC
- Spring / Spring boot 基於註解非同步程式設計@AsyncSpring Boot非同步程式設計
- Spring系列:基於Spring-AOP和Spring-Aspects實現AOP切面程式設計Spring程式設計
- Java基礎加強筆記——測試、反射、註解Java筆記反射
- Spring系列之aAOP AOP是什麼?+xml方式實現aop+註解方式實現aopSpringXML
- ATU 擴充套件,改變你的開發方式! 基於註解的單元測試神器套件
- 基於註解的方式使用spring-integration-redis分散式鎖SpringRedis分散式
- 基於註解的Spring多資料來源配置和使用Spring
- spring-AOP(二)實現原理之AspectJ註解方式Spring
- 基於註解的spring 在靜態方法中使用注入的類Spring