当前位置: 首页 > 知识库问答 >
问题:

带有原型bean的Spring AOP

诸葛雨泽
2023-03-14

我使用Spring AOP在我们的应用程序中触发指标。我已经创建了一个注释@CaptureMetrics,其中有一个与之关联的@周围的建议。除了在原型bean上调用方法的情况之外,所有标记为@CaptureMetrics的方法都可以很好地调用该建议。

注释具有@Target({ElementType.类型,元素类型。方法})

PointCut表达式:

@Around(value = "execution(* *.*(..)) && @annotation(captureMetrics)",
      argNames = "joinPoint,captureMetrics")

原型bean创建

@Bean
  @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  public DummyService getDummyServicePrototypeBean(int a, String b) {
    return new DummyService(a, b);
  }

DummyService有一个方法,叫做Dummymethod(String DummyString)

    @CaptureMetrics(type = MetricType.SOME_TYPE, name = "XYZ")
          public Response dummyMethod(id) throws Exception {
           // Do some work here
        }

dummyService时。dummyMethod(“123”)是从其他服务调用的,不调用@Around建议。

配置类

@Configuration
public class DummyServiceConfig {

  @Bean
  public DummyServiceRegistry dummyServiceRegistry(
      @Value("${timeout}") Integer timeout,
      @Value("${dummy.secrets.path}") Resource dummySecretsPath) throws IOException {
    ObjectMapper mapper = new ObjectMapper();
    Map<String, String> transactionSourceToTokens = mapper.readValue(
        dummySecretsPath.getFile(), new TypeReference<Map<String, String>>() {
        });
    DummyServiceRegistry registry = new DummyServiceRegistry();
    transactionSourceToTokens.forEach((transactionSource, token) ->
        registry.register(transactionSource,
            getDummyServicePrototypeBean(timeout, token)));

    return registry;
  }

  @Bean
  @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  public DummyService getDummyServicePrototypeBean(int a, String b) {
    return new DummyService(a, b);
  }

}

单例注册类

public class DummyServiceRegistry {
  private final Map<String, DummyService> transactionSourceToService = new HashMap<>();

  public void register(String transactionSource, DummyService dummyService) {
    this.transactionSourceToService.put(transactionSource, dummyService);
  }

  public Optional<DummyService> lookup(String transactionSource) {
    return Optional.ofNullable(transactionSourceToService.get(transactionSource));
  }
}

对此有什么建议吗?

注:

>

  • 原型虚拟服务用于调用第三方客户端。它是一个原型bean,因为它的状态会根据调用第三方的代表而变化。

    初始化期间的单例注册表bean构建{source_of_request、dummyService_prototype}的映射。要获得它调用getDummyService原型的DummyService原型Bean()

  • 共有1个答案

    索梓
    2023-03-14

    配置、注册表和原型虚拟bean都是正确的。

    我使用一个现有的集成测试来测试流程,在那里没有提供原型Bean,而是使用new关键字来实例化DummyService的新对象。这不是Spring管理的豆子。

    Spring AOP仅适用于Spring管理的bean

     类似资料:
    • 问题内容: 我试图将一个bean 注入一个bean中,以便对单例bean方法的每个新调用都具有原型bean的新实例。 考虑如下的单例豆: 我希望每次调用该方法时,都会使用一个新实例。 下面是原型bean: 似乎正在发生的事情是,Spring急于在该方法中交付PrototypeBean的新实例。也就是说,该方法中的两行代码将在每一行中创建一个prototypeBean的新实例。 因此,在第二行中,输

    • 我正在使用一些现有的代码,它正在做我以前没有见过的事情。我已经处理了使用方法注入将原型bean自动转换为单例,或者使用getBean()从上下文中获取bean。我在这段代码中看到的是一个bean,它是一个原型,使用getBean()检索,它具有自动连接的依赖关系。这些大部分都是单例bean,这是有道理的。但是有另一个原型bean的自动生成,从我所看到的情况来看,它似乎得到了一个新的bean。我的问

    • 第一次必须工作,但第二次出现错误: 没有类型为“java.lang.String”的合格bean可用:应至少有1个bean符合autowire候选。依赖项批注:{} 为什么? application.properties 我还发现,如果用@Component替换@Configuration或添加(代理BeanMethods = false),问题就会消失。 源代码

    • Spring具有bean类型/作用域,如 -singleton bean(每个应用程序上下文只有一个bean), -prototype bean(每个请求一个新bean) 现在,如果在单例bean中有对原型bean的引用,是否有办法在对单例bean的每个请求中获得一个新的原型bean(在单例bean中)。< br >如果是,配置会是什么样的?

    • 我想将一个原型作用域bean注入到一个单例中。这个原型bean应该只为它被注入的每个单例创建一次(据我所知,默认情况下是这样的)。但是,我确实希望每次都有一个稍微不同的bean,所以我希望能够用一个自定义注释来注释注入点,这是在构造原型bean时使用的。 问题是,我如何找出注入点上有哪些注解?

    • 我能够测试在单个bean中自动生成一个原型bean只会创建一个原型bean。 作为一个解决方案,我读到可以为原型bean定义AOP范围的代理,或者使用Spring的查找方法注入。 这是我试过的- 测试类 我是不是漏了什么?此外,对greet()方法的调用返回null。