有没有办法将 AOP 建议仅应用于类型的给定实例(例如单例 bean)
Is there a way to apply AOP advice only to a given instance of a type (e.g. singleton bean)
我有三个相同类型的 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
的子 class 并在其上应用自定义注释,它应该可以工作;但是,我也有兴趣学习其他方法。
看看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 {}
请注意,您在 getJdbcTemplateLocal
中有一个 JdbcTemplate
类型的 bean
此外,您的示例不起作用,因为第一个 @Pointcut
是在执行 NamedParameterJdbcTemplate.update
时,第二个是在 @Primary
注释上。而且没有用@Primary
注解的NamedParameterJdbcTemplate.update
方法。有@Primary
的方法是getJdbcTemplateLocal
.
我有三个相同类型的 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
的子 class 并在其上应用自定义注释,它应该可以工作;但是,我也有兴趣学习其他方法。
看看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 {}
请注意,您在 getJdbcTemplateLocal
JdbcTemplate
类型的 bean
此外,您的示例不起作用,因为第一个 @Pointcut
是在执行 NamedParameterJdbcTemplate.update
时,第二个是在 @Primary
注释上。而且没有用@Primary
注解的NamedParameterJdbcTemplate.update
方法。有@Primary
的方法是getJdbcTemplateLocal
.