我有三个相同类型的bean,用基于Java的配置定义:
@Bean(name = "jdbcTemplateLocal")
@Primary
public JdbcTemplate getJdbcTemplateLocal(@Qualifier("dataSource") BasicDataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "jdbcTemplateEk5_contragent")
public NamedParameterJdbcTemplate getJdbcTemplateEK5Contragent(@Qualifier("dataSourceEK5_contragent") BasicDataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
@Bean(name = "jdbcTemplateEk5_contract")
public NamedParameterJdbcTemplate getJdbcTemplateEK5Contract(@Qualifier("dataSourceEK5_contract") BasicDataSource dataSource) {
return new NamedParameterJdbcTemplate(dataSource);
}
我想将AOP建议仅应用于其中一个。我试着这样做(尽管我已经明白这是错的):
@Pointcut("execution(* org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(..))")
public void namedParameterJdbcTemplateUpdate() {}
@Pointcut("@annotation(org.springframework.context.annotation.Primary)")
public void beanAnnotatedAsPrimary() {}
@Around("namedParameterJdbcTemplateUpdate() && beanAnnotatedAsPrimary()")
这样的切入点表达式根本不匹配,如果我删除“&& ...”部分,它适用于所有3个bean。
有没有办法用AOP切入点表达式来做?
我认为如果我实现NamedParameterJdbcTemplate
的子类并在其上应用自定义注释,它应该可以工作;但是,我也有兴趣了解其他方法。
答案 0 :(得分:1)
看看bean() pointcut。你的例子将是:
@Around("execution(* org.springframework.jdbc.core.JdbcTemplate.update(..)) && bean(jdbcTemplateLocal)")
public Object jdbcTemplateUpdate(ProceedingJoinPoint joinPoint) throws Throwable {}
或
@Around("execution(* org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(..)) && bean(jdbcTemplateEk5_contragent)")
public Object namedParameterJdbcTemplateUpdate(ProceedingJoinPoint joinPoint) throws Throwable {}
请注意,JdbcTemplate
getJdbcTemplateLocal
类型的bean
此外,您的示例不起作用,因为第一个@Pointcut
正在执行NamedParameterJdbcTemplate.update
,第二个是@Primary
注释。并且没有使用NamedParameterJdbcTemplate.update
注释的@Primary
方法。 @Primary
的方法是getJdbcTemplateLocal
。