2017-02-16 52 views
1

我想要做這樣的事情http://www.gotoquiz.com/web-coding/programming/java-programming/log-sql-statements-with-parameter-values-filled-in-spring-jdbc/在JdbcOperations使用Spring AOP的看點不調用

我有一個Spring MVC的項目,我使用Spring 4.3.0.RELEASE。

我使用的是通用的抽象類爲我所有DAOS

public abstract class GenericDaoImpl { 
    @Autowired 
    protected JdbcTemplate jdbcTemplate; 
} 


@Repository 
public class UserDAOImpl extends GenericDaoImpl implements UserDAO{ 

} 

的JdbcTemplate在我的自動-config.xml中

<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${db.driver}" /> 
    <property name="url" value="${db.url}" /> 
    <property name="username" value="${db.user}" /> 
    <property name="password" value="${db.password}" /> 
</bean> 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

爲了定義爲實現更接近於我有什麼指南

添加這些依賴項到我的pom.xml中:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-aop</artifactId> 
    <version>4.3.0.RELEASE</version> 
</dependency> 

<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjrt</artifactId> 
    <version>1.8.9</version> 
</dependency> 

<dependency> 
    <groupId>org.aspectj</groupId> 
    <artifactId>aspectjweaver</artifactId> 
    <version>1.8.9</version> 
</dependency> 

我添加@EnableAspectJAutoProxy@Configuration類。

我的看點是:

@Aspect 
@Component 
public class SqlParametersLogger { 

    private final Logger logger = LoggerFactory.getLogger(SqlParametersLogger.class); 

    @Before("execution(* org.springframework.jdbc.core.JdbcOperations.*(..))") 
    public void log(JoinPoint jp) { 
     logger.info("Hello?"); 
    } 
} 

我的方面的功能不會被調用。我已經用我的服務層的切入點嘗試了這個方面,並且它可以工作。但使用JdbcOperations它不起作用。

有什麼想法?

回答

0

您的aop表達式被定義爲JdbcOperation。*的一個切入點,它是一個接口,並且不建議接口調用。

AspectJ可以攔截spring-managed-beans的spring框架中的切入點。 如果這個bean沒有被spring管理,你需要使用ProxyFactoryBean/ProxyFactory進行手動註冊以獲得建議。在你的情況下,你已經有了一個實現在Spring應用程序上下文中註冊的JdbcOperations接口的bean。

根據你的問題改變切入點使用JdbcOperations接口(jdbcTemplate bean定義)的任何實現應該可以解決你的問題。

例如

@Before("execution(* org.springframework.jdbc.core.JdbcOperations+.*(..))") 
+0

感謝您的回覆@Alex。我已經改變了 '@Before( 「執行(* org.springframework.jdbc.core.JdbcOperations。* (..))」)' 到 '@Before(「執行(* org.springframework .jdbc.core.JdbcOperations +。*(..))「)'但仍然沒有調用方面。 –

+0

我甚至試圖直接將它設置爲'@Before(「execution(* org.springframework.jdbc.core.JdbcTemplate。*(..))」)',但也沒有調用Aspect –