【问题标题】:How autowired service in enum in spring [duplicate]春季如何在枚举中自动装配服务[重复]
【发布时间】:2019-01-19 22:48:56
【问题描述】:

我想像下面的代码一样在枚举中自动装配服务。

public enum TopupChargeService {
TYPE1{
    public Response fun() {
        return new ServiceRepo().getService().func1();
    }
},
TYPE2{
    public Response fun() {
        return new ServiceRepo().getService().func2();
    }
};
public abstract Response fun();
@Component
public static class ServiceRepo {
    private Service service;
    public Service getService() {
        return service ;
    }
    public ServiceRepo () {
        service = new ServiceImpl();
    }
 }
}

并且服务代码类似于以下代码。

@Service
 public class ServiceImpl implements Service {

   @Autowired
   private RestTempalte restTemplate;

   Response fun1(){
     // use restTemplate in this fun 
   }

   Response fun2(){
     // use restTemplate in this fun 
   }

}

我还在配置类中将 restTemplate 定义为 bean。但 restTemplate 为空。

我的问题:1- 调用服务的方式是否正确? 2- 为什么 restTemplate 为空?

【问题讨论】:

  • 你在使用spring-boot吗?如果是这样,哪个版本或spring MVC,对于spring boot,如果你使用spring mvc,它将自动工作使用这个@Bean public RestTemplate restTemplate() { return new RestTemplate(); }
  • 不正确,你有你的ServiceRepo作为一个组件,你手动调用new ServiceRepo() 2次

标签: java spring javabeans


【解决方案1】:
new ServiceRepo()

您正在使用构造函数创建存储库,这就是 Spring 无法向该实例注入任何内容的原因。为了正确创建 bean,请尝试使用 ApplicationContext 创建 bean 实例。

另外,我建议您不要在这种情况下使用枚举。枚举更像是静态常量,它们不应该带来行为。考虑用 Spring bean 替换这个枚举。

【讨论】:

  • 感谢您的回答。事实上我的问题就像this
猜你喜欢
  • 1970-01-01
  • 2019-08-02
  • 2017-12-13
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 2020-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多