在我的SpringBoot1.5.10应用程序中,在Spring和HATEOAS中,我有一个带有ResourceProcessor服务的@Autowired bean,例如:
@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服务吗?如果可以,那么构造它的正确方法是什么?
发布于 2018-03-21 19:21:12
annotation javadoc的这一部分应该会让您感兴趣:
@Configuration类中的@Bean方法
通常,@Bean方法在@Configuration类中声明。在这种情况下,bean方法可以通过直接调用类中的其他@Bean方法来引用它们。这确保bean之间的引用是强类型的和可导航的。这种所谓的“bean间引用”可以保证尊重作用域和AOP语义,就像getBean()查找一样。
例子:
@Bean
public FooService fooService() {
return new FooService(fooRepository());
}
@Bean
public FooRepository fooRepository() {
return new JdbcFooRepository(dataSource());
}这意味着您不必使用@Autowired来设置@Bean声明中的依赖项,而是引用另一个带有@Bean注释的方法。
但是,您真的需要设置依赖项来创建bean吗?一点也不。OrderHandler仅在process()调用期间使用。
因此,您可以简单地将OrderHandler注入到与使用@Bean注释的方法相同的级别,并在匿名类中使用:
@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(/*...*/);
}
};
}发布于 2018-03-21 19:01:23
我想你可以把orderHandler调到外教室去。以您的方式,当您自己创建ResourceProcessor实例时,它将无法工作。
@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(/*...*/);
}
};
}https://stackoverflow.com/questions/49414512
复制相似问题