有没有办法只将AOP建议应用于某个类型的给定实例(例如,单例bean)

时间:2018-03-23 10:39:13

标签: java spring spring-aop

我有三个相同类型的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的子类并在其上应用自定义注释,它应该可以工作;但是,我也有兴趣了解其他方法。

1 个答案:

答案 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