首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@Bean ResourceProcessor with @Au牛毛

@Bean ResourceProcessor with @Au牛毛
EN

Stack Overflow用户
提问于 2018-03-21 18:55:07
回答 2查看 101关注 0票数 1

在我的SpringBoot1.5.10应用程序中,在Spring和HATEOAS中,我有一个带有ResourceProcessor服务的@Autowired bean,例如:

代码语言:javascript
复制
@Bean
public ResourceProcessor<Resource<Order>> orderResourceProcessor() {
    return new ResourceProcessor<Resource<Order>>() {
        @Autowired
        private OrderHandler orderHandler;

        @Override
        public Resource<Order> process(Resource<Order> resource) {
            Order order = resource.getContent();
            Payment payment = orderHandler.payment(order);

            resource.add(makeLink(payment));

            return resource;
        }

        private Link makelink(Payment payment) {
            return new Link(/*...*/);
        }
    };
}

当添加@Autowired服务时,资源处理器bean将不再被触发,不幸的是,当OrderHandler被注释掉时,资源处理器将按其应有的方式运行。

ResourceProcessor可以使用@Autowired服务吗?如果可以,那么构造它的正确方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-21 19:21:12

annotation javadoc的这一部分应该会让您感兴趣:

@Configuration类中的@Bean方法

通常,@Bean方法在@Configuration类中声明。在这种情况下,bean方法可以通过直接调用类中的其他@Bean方法来引用它们。这确保bean之间的引用是强类型的和可导航的。这种所谓的“bean间引用”可以保证尊重作用域和AOP语义,就像getBean()查找一样。

例子:

代码语言:javascript
复制
 @Bean
 public FooService fooService() {
     return new FooService(fooRepository());
 }

 @Bean
 public FooRepository fooRepository() {
     return new JdbcFooRepository(dataSource());
 }

这意味着您不必使用@Autowired来设置@Bean声明中的依赖项,而是引用另一个带有@Bean注释的方法。

但是,您真的需要设置依赖项来创建bean吗?一点也不。OrderHandler仅在process()调用期间使用。

因此,您可以简单地将OrderHandler注入到与使用@Bean注释的方法相同的级别,并在匿名类中使用:

代码语言:javascript
复制
@Autowired
private OrderHandler orderHandler;  // only change

@Bean
public ResourceProcessor<Resource<Order>> orderResourceProcessor() {
    return new ResourceProcessor<Resource<Order>>() {


        @Override
        public Resource<Order> process(Resource<Order> resource) {
            Order order = resource.getContent();
            Payment payment = orderHandler.payment(order);

            resource.add(makeLink(payment));

            return resource;
        }

        private Link makelink(Payment payment) {
            return new Link(/*...*/);
        }
    };
}
票数 2
EN

Stack Overflow用户

发布于 2018-03-21 19:01:23

我想你可以把orderHandler调到外教室去。以您的方式,当您自己创建ResourceProcessor实例时,它将无法工作。

代码语言:javascript
复制
@Autowired
private OrderHandler orderHandler;

@Bean
public ResourceProcessor<Resource<Order>> orderResourceProcessor() {
   return new ResourceProcessor<Resource<Order>>() {


    @Override
    public Resource<Order> process(Resource<Order> resource) {
        Order order = resource.getContent();
        Payment payment = orderHandler.payment(order);

        resource.add(makeLink(payment));

        return resource;
    }

    private Link makelink(Payment payment) {
        return new Link(/*...*/);
    }
};
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49414512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档