2017-05-15 55 views
1

返回在這個例子中:Spring AOP的 - 進行代理對象從方法

public class ConnectionPool { 
    public java.sql.Connection getConnection() { 
     ... 
    } 
} 

@Bean 
@Scope("singleton") 
public ConnectionPool connectionPool(...) throws Exception { 
    return new ConnectionPoolImpl(...); 
} 

我想監視Connection對象上調用java.sql.Connection.close()從返回的getConnection()。

我嘗試將@Lookup添加到getConnection()方法,但它沒有效果。

如何讓Spring代理java.sql.Connection對象?

+0

監控器返回的代理和做什麼? –

+0

監視,並添加一個切入點。我正在寫一個泄漏檢測器,檢查每個HTTP請求後所有連接都返回到池中。 – bcoughlan

+1

這不是Spring可以獨立完成的事情,假設'getConnection'返回由您的代碼管理的'Connection'對象。你需要用'@ AfterReturning'或'@ Around'的建議攔截'getConnection'。然後你需要實現這個建議來包裝在某個委託對象中返回的Connection對象(或者構建一個代理),只攔截它的'close'方法,並進行檢測。 –

回答

-1
@Pointcut("within(java.sql.Connection.close(..)") 
public void closeAspect() {} 

@Around("closeAspect()") 
public void logAround(ProceedingJoinPoint joinPoint) throws Throwable 
{ 
    joinPoint.getThis();//Will return the object on which it(close function) is called 
    //Do whatever you want to do here 
    joinPoint.proceed(); 
    //Do whatever you want to do here 
} 
+0

你假設'Connection'對象由Spring管理(因此可以被代理)。你能否更明確地解釋並解釋你爲什麼做出這樣的假設? –

+0

你說得對,如果連接對象不是由Spring管理的話,這段代碼將不起作用。但考慮到問題中沒有任何地方明確提到它不是春季管理的豆類,並且也在查看用於這個問題的標籤,我相信這是一個票價假設。 – pvpkiran

0

您可以創建的連接池的代理,並在bean創建方法

@Bean 
@Scope("singleton") 
public ConnectionPool connectionPool(...) throws Exception { 
    ConnectionPoolImpl delegate = new ConnectionPoolImpl(...); 
    ConnectionPoolCallHandler callHandler = new ConnectionPoolCallHandler(delegate); 
    ConnectionPool proxy = Proxy.newProxyInstance(
       ConnectionPool.getClass().getClassLoader(), 
       new Class[]{ConnectionPool.class}, 
       callHandler); 

// return new ConnectionPoolImpl(...); 
    return proxy; 
} 

public class ConnectionPoolCallHandler implements InvocationHandler { 
    private ConnectionPoolImpl delegate; 
    public ConnectionPoolCallHandler(ConnectionPoolImpl delegate) { 
     this.delegate=delegate; 
    } 
    public Object invoke(Object proxy, Method method, Object[] args) 
      throws Throwable { 
     //all invoked methods should call 
     //appropriate methods of delegate passing all parameters 
     //plus your additional tracking logic here 
    } 
} 
相關問題