如何在构造函数中使用@Autowired bean?

时间:2018-01-29 12:24:31

标签: java spring spring-boot annotations

这是我的班级,

public class MyBusinessException extends RuntimeException {
    @Autowired
    private MessageSource messageSource;

    private String errorCode;

    private String messageInEnglish;

    public MyBusinessException(String errorCode){
       this.errorCode=errorCode;
       this.messageInEnglish=messageSource.getMessage(this.code,null, Locale.ENGLISH);
    }
}

这是一个异常类。当我将errorCode作为参数传递给构造函数时,它应该填充错误消息,这就是我正在寻找的。实际上我想实例化这样的类

throw new MyBusinessException("MY-ERROR-CODE");//want to initiate like this(only one argument for constructor)

如何实现这样的目标?

到目前为止我所做的所有这些:

  1. 构造函数自动装配。
  2. 使用@PostConstruct

4 个答案:

答案 0 :(得分:4)

  

抛出新的MyBusinessException(" MY-ERROR-CODE"); //想要启动   这(构造函数只有一个参数)

您不能将@Autowired与不是由Spring创建的对象一起使用 我认为您应该重构代码以向MyBusinessException构造函数提供所有需要的信息 你不需要将它与Spring结合。

依赖于Spring的逻辑:

@Autowired
private MessageSource messageSource; 
...
messageSource.getMessage(this.code,null, Locale.ENGLISH);

可以移动到Spring bean,它将创建一个完全初始化的MyBusinessException实例 此外,其他例外可能需要messageSource.getMessage(this.code,null, Locale.ENGLISH)。在特定的类中移动它这个逻辑是有道理的。

@Bean
public class ExceptionFactory{
   @Autowired
   private MessageSource messageSource; 

   public MyBusinessException createMyBusinessException(String errorCode){        
      return new MyBusinessException(errorCode, messageSource.getMessage(this.code,null, Locale.ENGLISH));        
  } 
}

您可以注意到createMyBusinessException()为客户提供了一个简单的API:他们只需传递错误代码String即可创建例外。
MessageSource依赖项是一个他们不需要打扰的实现细节。

例如,这就足够了:

throw exceptionFactory.createMyBusinessException("MY-ERROR-CODE");

答案 1 :(得分:2)

依赖注入仅适用于Spring创建的实例。

由于您手动初始化异常,因此需要将MessageSource注入@Component抛出此异常。

然后,您可以将MessageSource传递给MyBusinessException的构造函数,或者使用所需语言获取消息,并将此消息传递给构造函数。

@Component
public class MyComponentDoingBusinessLogic {

    private MessageSource messageSource;

    @Autowired
    public MyComponentDoingBusinessLogic(MessageSource messageSource) {
      this.messageSource = messageSource;
    }

    public void someBusinessLogic() {
      //Doing something
      if (errorState) {
        throw new MyBusinessException(yourErrorCode, messageSource);
      }
    }
}

答案 2 :(得分:0)

你不能在ctor中使用@Autowired,因为它还没有被Spring初始化。

正确的方法是实现InitializingBean,这基本上是Spring的ctor,并且(afterPropertiesSet方法)可以使用注入的字段。

答案 3 :(得分:0)

你不能这样做。抛出时会构造一个异常,这意味着它不会被Spring初始化。你可以做的是使用静态方法来获取当前的Spring应用程序上下文,并从那里获取你的bean。

这是否是一个干净的解决方案是另一个问题,但你没有问过这个问题。