AspectJ使用org.aspectj.lang.JoinPoint接口表示目標類連接點對象,如果是環繞增強時,使用org.aspectj.lang.ProceedingJoinPoint表示連接點對象,該類是JoinPoint的子接口。任何一個增強方法都可以通過將第一個入參聲明為JoinPoint訪問到連接點上下文的信息。我們先來了解一下這兩個接口的主要方法:
1)JoinPoint
java.lang.Object[] getArgs():獲取連接點方法運行時的入參列表;
Signature getSignature() :獲取連接點的方法簽名對象;
java.lang.Object getTarget() :獲取連接點所在的目標對象;
java.lang.Object getThis() :獲取代理對象本身;
2)ProceedingJoinPoint
ProceedingJoinPoint繼承JoinPoint子接口,它新增了兩個用於執行連接點方法的方法:
java.lang.Object proceed() throws java.lang.Throwable:通過反射執行目標對象的連接點處的方法;
Java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通過反射執行目標對象連接點處的方法,不過使用新的入參替換原來的入參。
一、概述
AOP的實現方法在上兩篇博客中已經用了兩種方法來實現現在的問題來了雖然我們利用AOP,那么客戶端如何信息傳遞?利用JoinPoint接口來實現客戶端給具體實現類的傳遞參數。
二、代碼演示。
目錄結構:
SecurityHandler.java
package import public SecurityHandler{
- checkSecurity(JoinPoint joinPoint){
- ( i = ; i < joinPoint.getArgs().length; i++) {
- );
- }
Client.java
package import import import public Client {
- main(String[] args) {
- ClassPathXmlApplicationContext();
- UserManager userManager=(UserManager) factory.getBean();
- , );
- }
UserManager.java
package public UserManager {
- addUser(String username,String password);
- delUser( userId);
- String findUserById( userId);
- modifyUser( userId,String username,String password);
- }
UserManagerImpl.java
package public UserManagerImpl UserManager {
- addUser(String username, String password) {
- );
- delUser( userId) {
- );
- String findUserById( userId) {
- );
- ;
- modifyUser( userId, String username, String password) {
- );
- // private void checkSecurity(){ // System.out.println("checkSecurity"); // // } }
applicationContext.xml
<? = =?> < =
- =
- =
- =
- ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
- < = =
- = =/> <> = => = =
- = =
- > </> </>
效果圖:
三、總結。
我們可以通過Advice中添加一個JoinPoint參數,這個值會由spring自動傳入,從JoinPoint中可以取得。