SpringBoot整合aop面向切面編程過程解析
這篇文章主要介紹了SpringBoot整合aop面向切面編程過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP是Spring框架中的一個(gè)重要內(nèi)容,它通過對(duì)既有程序定義一個(gè)切入點(diǎn),然后在其前后切入不同的執(zhí)行內(nèi)容,比如常見的有:打開數(shù)據(jù)庫連接/關(guān)閉數(shù)據(jù)庫連接、打開事務(wù)/關(guān)閉事務(wù)、記錄日志等?;贏OP不會(huì)破壞原來程序邏輯,因此它可以很好的對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,提高程序的可重用性,同時(shí)提高了開發(fā)的效率。
spring aop默認(rèn)是使用JDK動(dòng)態(tài)代理,即基于接口的代理,可以通過proxy-target-class屬性修改。如果proxy-target-class=true, 那基于類的代理將起作用(這時(shí)需要cglib庫)。
引入依賴
<!--aop--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!--spring 的aop默認(rèn)是使用JDK代理,即--> <!--用來動(dòng)態(tài)代理用的,基于類的代理--> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.2.12</version> </dependency>
注:在完成了引入AOP依賴包后,一般來說并不需要去做其他配置。也許在Spring中使用過注解配置方式的人會(huì)問是否需要在程序主類中增加@EnableAspectJAutoProxy來啟用,實(shí)際并不需要。AOP的默認(rèn)配置屬性中spring.aop.auto屬性默認(rèn)是開啟的,也就是說只要引入了AOP依賴后,默認(rèn)已經(jīng)增加了@EnableAspectJAutoProxy。
實(shí)現(xiàn)AOP的切面主要有以下幾個(gè)要素:
- 使用@Aspect注解將一個(gè)java類定義為切面類
- 使用@Pointcut定義一個(gè)切入點(diǎn),可以是一個(gè)規(guī)則表達(dá)式,比如某個(gè)package下的所有函數(shù),也可以是一個(gè)注解等。
- 根據(jù)需要在切入點(diǎn)不同位置的切入內(nèi)容,即不同的通知:@Before、@After、@AfterReturning、@Around、@AfterThrowing
普通業(yè)務(wù)組件
/** * 普通業(yè)務(wù)組件 */ @Component public class CustomerBusiness { private String message; public void setMessage(String message) { this.message = message; } public void getMessage() { System.out.println("Your Message : " + message); } }
切面
@Aspect //聲明式一個(gè)切面組件 @Component //加入到IoC容器 public class TimeHandler { //指定切入點(diǎn)表達(dá)式,攔截那些方法,即為哪些類生成代理對(duì)象 @Pointcut("execution(* com.linhw.demo.ascpet.CustomerBusiness.*())") public void pointCut(){ } @Before("pointCut()") public void printBeforeTime() { System.out.println("---------------Before CurrentTime = " + System.currentTimeMillis()); } @After("pointCut()") public void prinAftertTime() { System.out.println("---------------After CurrentTime = " + System.currentTimeMillis()); } }
測(cè)試
@RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = {AopApplication.class}) public class AopTest { @Autowired CustomerBusiness business; @Test public void testAop(){ business.setMessage("hello world"); business.getMessage(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java入門概念個(gè)人理解之package與import淺析
下面小編就為大家?guī)硪黄猨ava入門概念個(gè)人理解之package與import淺析。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-08-08springboot中用fastjson處理返回值為null的屬性值
在本篇文章里小編給大家整理的是一篇關(guān)于springboot中用fastjson處理返回值問題詳解內(nèi)容,需要的朋友們參考下。2020-03-03SpringBoot的服務(wù)注冊(cè)與發(fā)現(xiàn)示例
本篇文章主要介紹了SpringBoot的服務(wù)注冊(cè)與發(fā)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05關(guān)于Feign的覆寫默認(rèn)配置和Feign的日志
這篇文章主要介紹了關(guān)于Feign的覆寫默認(rèn)配置和Feign的日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06