Spring AOP AspectJ基本設定如下
使用前需要相關的library,下面為Maven的pom.xml
的dependency設定
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${org.springframework.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.8.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
下面範例在Spring MVC的Controller的method加入AOP
Spring MVC 配置檔dispatcher-servlet.xml
設定如下
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd ">
<mvc:annotation-driven />
<context:annotation-config/>
<context:component-scan base-package="idv.matthung.controller" />
<!-----AOP設定---->
<aop:aspectj-autoproxy/>
<bean id="MyControllerAspect" class="idv.matthung.aop.MyControllerAspect" />
</beans>
被加上AOP的MyController
package idv.matthung.controller;
@Controller
@RequestMapping(value="/my")
public class MyController {
@RequestMapping(value="/hello")
public void hello() {
System.out.println("hello matt");
}
}
新增一個冠有@Aspect
的Aspect類別MyControllerAspect
,在此類別新增一個before()
方法並冠上@Before
annotation。
@Before
的參數"execution(* idv.matthung.controller.MyController.*(..))"
為Pointcut Designators表示式(PCD, PCD expression),用來表示要加入AOP advice的對象,即MyController
中的全部方法,沒特別需求的話就使用execution
。
"execution(* idv.matthung.controller.MyController.*(..))"
的第一個參數*
代表返回值為任意類型,第二個參數idv.matthung.controller.MyController.*(..)
為AOP要切入的對象,MyController
後的*
代表任意方法名,(..)
代表任意參數。
package idv.matthung.aop;
@Aspect
public class MyControllerAspect {
@Before("execution(* idv.matthung.controller.MyController.*(..))")
public void before(JoinPoint joinPoint) {
System.out.println("before");
System.out.println(joinPoint.getSignature().getName());
System.out.println("-----");
}
}
設定好後,在呼叫MyController.hello()
時,因為加上了@Before
的AOP advice切點,所以在執行前會先執行MyControllerAspect.before()
,執行結果如下
before
hello
-----
hello matt
以下為各種advice,而事實上advice可由一個或多個@Pointcut
組成
@Before
:在執行前切入。@After
:在執行後切入。@AfterReturning
:在執行後切入並擷取返回值。@AfterThrowing
:在執行中拋出錯誤時切入。@Around
:在執行的前後插入。
如果覺得文章有幫助的話還幫忙點個Google廣告,感恩。
參考:
- Spring AOP + AspectJ annotation example
- 5. Aspect Oriented Programming with Spring
- 5.2.3. Declaring a pointcut
- Pointcuts
- @AspectJ Based AOP with Spring
- Spring AOP: What's the difference between JoinPoint and PointCut? Ask
- When to use @Pointcut & @Before, @After AOP Annotations
- Java and Spring development
沒有留言:
張貼留言