有没有办法将 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.