Java 面向切面程式設計AOP
一:背景
Spring的AOP的存在目的是為了解耦。AOP可以讓一組類共享相同的行為。在OOP中只能透過繼承類和實現介面,來是程式碼的耦合度增強,且類繼承只能為單繼承,阻礙更多行為新增到一組類上,AOP彌補了OPP的不足。
二:概述 Spring支援AspectJ的註解方式切面程式設計
1.使用@Aspect 宣告一個切面。
2.使用@After,@Before,@Around 定義建言(advice),可直接將攔截規則(切點)作為引數。
3.其中@After,@Before,@Around引數的攔截規則為切點(PointCut) ,為了使切點複用,可使用@PointCut 專門定義攔截規則,然後在@After,@Before,@Around的引數中呼叫。
4.其中符合條件的每一個被攔截處為連線點(JoinPoint)
三:程式碼例項
1.pom.xml
2.攔截規則的註解
2.註解的被攔截類
3.方法規則被攔截類
4.編寫切面
5.配置類
6.執行類
Spring的AOP的存在目的是為了解耦。AOP可以讓一組類共享相同的行為。在OOP中只能透過繼承類和實現介面,來是程式碼的耦合度增強,且類繼承只能為單繼承,阻礙更多行為新增到一組類上,AOP彌補了OPP的不足。
二:概述 Spring支援AspectJ的註解方式切面程式設計
1.使用@Aspect 宣告一個切面。
2.使用@After,@Before,@Around 定義建言(advice),可直接將攔截規則(切點)作為引數。
3.其中@After,@Before,@Around引數的攔截規則為切點(PointCut) ,為了使切點複用,可使用@PointCut 專門定義攔截規則,然後在@After,@Before,@Around的引數中呼叫。
4.其中符合條件的每一個被攔截處為連線點(JoinPoint)
三:程式碼例項
1.pom.xml
點選(此處)摺疊或開啟
-
<dependency>
-
<groupId>org.springframework</groupId>
-
<artifactId>spring-core</artifactId>
-
</dependency>
-
<dependency>
-
<groupId>org.springframework</groupId>
-
<artifactId>spring-beans</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework</groupId>
-
<artifactId>spring-context</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.springframework</groupId>
-
<artifactId>spring-aop</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.aspectj</groupId>
-
<artifactId>aspectjrt</artifactId>
-
</dependency>
-
-
<dependency>
-
<groupId>org.aspectj</groupId>
-
<artifactId>aspectjweaver</artifactId>
- </dependency>
點選(此處)摺疊或開啟
-
@Target(ElementType.METHOD)
-
@Retention(RetentionPolicy.RUNTIME)
-
@Documented
-
public @interface Action {
-
String name();
- }
點選(此處)摺疊或開啟
-
@Service
-
public class DemoAnnotationService {
-
-
@Action(name = "註解式攔截的add操作")
-
public void add() {
-
System.out.println("======DemoAnnotationService方法add()=========");
-
}
- }
點選(此處)摺疊或開啟
-
@Service
-
public class DemoMethodService {
-
public String add() throws Exception{
-
System.out.println("======DemoMethodService方法add()=========");
-
int i=100/0;
-
return "SUCCESS";
-
}
- }
4.編寫切面
點選(此處)摺疊或開啟
-
@Aspect
-
@Component
-
public class LogAspect {
-
-
@Pointcut("@annotation(com.gemdale.gmap.spring.boot.demo.Action)")
-
public void annotationPointCut() {
-
}
-
-
@After("annotationPointCut()")
-
public void after(JoinPoint joinPoint) {
-
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
-
Method method = signature.getMethod();
-
Action action = method.getAnnotation(Action.class);
-
-
System.out.println("註解式攔截 " + action.name());
-
}
-
-
@Before("execution(* com.gemdale.gmap.spring.boot.demo.DemoMethodService.*(..))")
-
public void methodBefore(JoinPoint joinPoint) {
-
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
-
Method method = signature.getMethod();
-
System.out.println("before方法規則式攔截 " + method.getName());
-
}
-
-
@After("execution(* com.gemdale.gmap.spring.boot.demo.DemoMethodService.*(..))")
-
public void methodAfter(JoinPoint joinPoint) {
-
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
-
Method method = signature.getMethod();
-
System.out.println("after方法規則式攔截 " + method.getName());
-
}
-
-
@AfterReturning(pointcut = "execution(* com.gemdale.gmap.spring.boot.demo.DemoMethodService.*(..))", returning = "result")
-
public void methodAfterResult(JoinPoint joinPoint, Object result) {
-
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
-
Method method = signature.getMethod();
-
System.out.println("after result方法規則式攔截 " + method.getName() + "result=" + result);
-
}
-
-
@AfterThrowing(pointcut = "execution(* com.gemdale.gmap.spring.boot.demo.DemoMethodService.*(..))", throwing = "e")
-
public void methodAfterException(JoinPoint joinPoint, Exception e) {
-
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
-
Method method = signature.getMethod();
-
System.out.println("after exception方法規則式攔截 " + method.getName() + " e=" + e.getMessage());
-
}
-
- }
點選(此處)摺疊或開啟
-
@Configuration
-
@ComponentScan("com.gemdale")
-
@EnableAspectJAutoProxy
-
public class AppliactionConfig {
-
- }
6.執行類
點選(此處)摺疊或開啟
-
public class Start {
-
public static void main(String[] args) throws Exception{
-
-
AnnotationConfigApplicationContext configApplicationContext = new AnnotationConfigApplicationContext(
-
AppliactionConfig.class);
-
// UseFunctionService
-
// useFunctionService=configApplicationContext.getBean(UseFunctionService.class);
-
// System.out.println(useFunctionService.sayHello("Gengchong"));
-
DemoAnnotationService demoAnnotationService = configApplicationContext.getBean(DemoAnnotationService.class);
-
DemoMethodService demoMethodService = configApplicationContext.getBean(DemoMethodService.class);
-
-
demoAnnotationService.add();
-
-
demoMethodService.add();
-
-
configApplicationContext.close();
-
}
- }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28624388/viewspace-2133594/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- AOP 面向切面程式設計程式設計
- AOP(面向切面程式設計)程式設計
- 面向切面程式設計AOP程式設計
- Java中的面向切面程式設計(AOP)Java程式設計
- AOP--面向切面程式設計程式設計
- 前端js面向切面程式設計(AOP)前端JS程式設計
- Android面向切面程式設計(AOP)Android程式設計
- 設計模式之面向切面程式設計AOP設計模式程式設計
- Android AOP面向切面設計程式設計Android程式設計
- aop面向切面程式設計的實現程式設計
- 前端解讀面向切面程式設計(AOP)前端程式設計
- Spring之AOP面向切面程式設計Spring程式設計
- 01.AOP(AspectOrientatedProgramming面向切面程式設計)程式設計
- Spring AOP——Spring 中面向切面程式設計Spring程式設計
- Spring AOP(面向切面程式設計)是什麼?Spring程式設計
- 手寫Spring---AOP面向切面程式設計(4)Spring程式設計
- 手寫Spring---AOP面向切面程式設計(3)Spring程式設計
- Spring 面向切面程式設計AOP 詳細講解Spring程式設計
- JS實現AOP 面向切面程式設計 (裝飾者模式)JS程式設計模式
- Spring Boot實戰系列(3)AOP面向切面程式設計Spring Boot程式設計
- Spring之旅第七站:面向切面程式設計(AOP)Spring程式設計
- Day67 Spring AOP(面向切面程式設計) 和代理設計模式Spring程式設計設計模式
- 程式設計思想 面向切面程式設計程式設計
- JAVA_動態代理AOP切面程式設計Java程式設計
- Spring 面向切面AOPSpring
- .NET Core 實現動態代理做AOP(面向切面程式設計)程式設計
- Util應用框架基礎(三) - 面向切面程式設計(AspectCore AOP)框架程式設計
- Spring-AOP(面向切面)Spring
- React Native面向切面程式設計React Native程式設計
- 【Android】AOP 面向切面程式設計(一) AspectJ 處理網路錯誤Android程式設計
- Spring AOP:面向切面程式設計的核心概念與實際應用Spring程式設計
- 基於SpringBoot AOP面向切面程式設計實現Redis分散式鎖Spring Boot程式設計Redis分散式
- 四、Spring-面向切面程式設計Spring程式設計
- 面向切面程式設計和依賴注入程式設計依賴注入
- Spring框架系列(4) - 深入淺出Spring核心之面向切面程式設計(AOP)Spring框架程式設計
- (系列七).net8 Aop切面程式設計程式設計
- 在Javascript中進行面向切面程式設計JavaScript程式設計
- 面向切面程式設計之瘋狂的 Aspects程式設計