Spring深入講解實現(xiàn)AOP的三種方式
[重點] 使用AOP織入 需要導(dǎo)入一個依賴包
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.9.1</version>
</dependency>
</dependencies>方式一:使用原生Spring API接口
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 注冊bean-->
<bean id="userService" class="com.kero.service.UserServiceImpl"/>
<bean id="log" class="com.kero.log.Log"/>
<bean id="afterlLog" class="com.kero.log.AfterLog"/>
<!-- 配置aop 需要導(dǎo)入aop的約束-->
<aop:config>
<!-- 切入點 expression表達式 expression(要執(zhí)行的位置 )-->
<aop:pointcut id="pointcut" expression="execution(* com.kero.service.UserServiceImpl.*(..))"/>
<!-- 執(zhí)行環(huán)繞增加-->
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterlLog" pointcut-ref="pointcut"/>
</aop:config>
</beans>Log
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;
public class Log implements MethodBeforeAdvice {
//method:要執(zhí)行的目標(biāo)對象的方法
//objects:參數(shù)
//target:目標(biāo)對象
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println(target.getClass().getName() + "的" + method.getName() + "被執(zhí)行了");
}
}
import org.springframework.aop.AfterReturningAdvice;
import java.lang.reflect.Method;
public class AfterLog implements AfterReturningAdvice {
//method:要執(zhí)行的目標(biāo)對象的方法
//objects:參數(shù)
//target:目標(biāo)對象
//returnValue:返回值
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
System.out.println("執(zhí)行了"+ method.getName() + "方法,返回結(jié)果為:"+returnValue);
}
}Service
import org.springframework.stereotype.Service;
@Service
public interface UserService {
public void add();
public void delete();
public void update();
public void search();
}
public class UserServiceImpl implements UserService{
@Override
public void add() {
}
@Override
public void delete() {
}
@Override
public void update() {
}
@Override
public void search() {
}
}test動態(tài)代理 代理的是接口(代理模式是SpringAOP的底層)
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//動態(tài)代理 代理的是接口
UserService userService = context.getBean("userService", UserService.class);
userService.add();
}
}方式二:使用自定義類
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 注冊bean-->
<bean id="userService" class="com.kero.service.UserServiceImpl"/>
<bean id="log" class="com.kero.log.Log"/>
<bean id="afterlLog" class="com.kero.log.AfterLog"/>
<bean id="diy" class="com.kero.diy.DiyPointCut"/>
<aop:config>
<!-- 自定義切面 ref要引用的類-->
<aop:aspect ref="diy">
<!-- 切入點-->
<aop:pointcut id="point" expression="execution(* com.kero.service.UserServiceImpl.*(..))"/>
<!-- 通知-->
<aop:before method="before" pointcut-ref="point"/>
<aop:after method="after" pointcut-ref="point"/>
</aop:aspect>
</aop:config>
</beans>DIY類
public class DiyPointCut {
public void before(){
System.out.println("````方法執(zhí)行前````");
}
public void after(){
System.out.println("````方法執(zhí)行后````");
}
}其他的不變
方式三:使用注解實現(xiàn)
配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 注冊bean-->
<bean id="userService" class="com.kero.service.UserServiceImpl"/>
<bean id="log" class="com.kero.log.Log"/>
<bean id="afterlLog" class="com.kero.log.AfterLog"/>
<!-- 開啟注解支持-->
<aop:aspectj-autoproxy/>
<bean id="annotationPointCut" class="com.kero.diy.AnnotationPointCut"/>
</beans>自定義類
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
//使用注解方式實現(xiàn)AOP
@Aspect
//標(biāo)注這個類是一個切面
public class AnnotationPointCut {
@Before("execution(* com.kero.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("````方法執(zhí)行前````");
}
@After("execution(* com.kero.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("````方法執(zhí)行后````");
}
}其他不變
補充知識:execution表達式
execution表達式的詳解
切入點表達式:execution(* 包名.*.*(..))
整個表達式可以分為五個部分:
1、execution(): 表達式主體。
2、第一個*號:方法返回類型, *號表示所有的類型。
3、包名:表示需要攔截的包名。
4、第二個*號:表示類名,*號表示所有的類。
5、*(..):最后這個星號表示方法名,*號表示所有的方法,后面( )里面表示方法的參數(shù),兩個句點表示任何參數(shù)
其中除了返回類型模式、方法名模式和參數(shù)模式外,其它項都是可選的。
舉例:
execution(public * *(..)) 匹配所有的public修飾符的方法
execution(* set*(..)) 匹配所有”set”開頭的方法:
execution(* com.kero.service.UserServiceImpl.*(..))) 匹配UserServiceImpl接口/類的所有方法:
到此這篇關(guān)于Spring深入講解實現(xiàn)AOP的三種方式的文章就介紹到這了,更多相關(guān)Spring AOP內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Builder模式構(gòu)建MAP/LIST的實例講解
下面小編就為大家?guī)硪黄狫ava Builder模式構(gòu)建MAP/LIST的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
SpringAOP 如何通過JoinPoint獲取參數(shù)名和值
這篇文章主要介紹了SpringAOP 通過JoinPoint獲取參數(shù)名和值的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06
Java面試題沖刺第三十天--數(shù)據(jù)庫(6)
這篇文章主要為大家分享了最有價值的三道關(guān)于數(shù)據(jù)庫的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-09-09
SpringBoot使用Feign調(diào)用其他服務(wù)接口
這篇文章主要介紹了SpringBoot使用Feign調(diào)用其他服務(wù)接口,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03

