【问题标题】:How to create Autowire with custom constructor arguments如何使用自定义构造函数参数创建 Autowire
【发布时间】:2016-09-18 11:46:44
【问题描述】:

如何在 Spring 中使用自定义构造函数参数创建 Autowire?以下是我的示例代码。我得到了无法自动装配字段;没有找到默认构造函数错误。我无法引入默认构造函数,因为 AbstractExecutor 类没有默认构造函数。

IExecutor

public interface IExecutor {
    Object execute();
}

抽象执行器

public abstract class AbstractExecutor implements IExecutor {
    private IInputPropertyBean inputObject;
    private IOutputPropertyBean outputObject;
    public AbstractExecutor(IInputPropertyBean inputObject, IOutputPropertyBean outputObject) {
        this.inputObject = inputObject;
        this.outputObject = outputObject;
    }
    public abstract boolean isValidInput(IInputPropertyBean inputObject) ;
    public abstract  IInputPropertyBean getInputValues(IInputPropertyBean inputObject);
    public abstract  IOutputPropertyBean process(IInputPropertyBean attribute);
    public abstract  IOutputPropertyBean getOutputValues(IInputPropertyBean inputObject, IOutputPropertyBean outputObject;
    @Override
    public Object execute(){
        if(isValidInput(inputObject)){
            IInputPropertyBean inputAttribute = getInputValues(inputObject);
            IOutputPropertyBean outputAttribute = process(inputAttribute);
            outputObject = (IOutputPropertyBean) getOutputValues(outputAttribute, outputObject);
            return outputObject;
        }
    }
}

用户执行器

@Repository("userExecutor")
public class UserExecutor extends AbstractExecutor { 
    public UserExecutor(@Qualifier("userInput") IInputPropertyBean inputObject, @Qualifier("userOutput")IOutputPropertyBean outputObject) {
        super(inputObject, outputObject);
    }

//override methods
}

IInputPropertyBean

public interface IInputPropertyBean { }

IOutputPropertyBean

public interface IOutputPropertyBean { }

用户输入

@Component("userInput")
public class UserInput implements IInputPropertyBean { //user sepecific properties }

用户输出

@Component("userOutput")
public class UserOutput implements IOutputPropertyBean { //user sepecific properties }

用户服务实现

@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    @Qualifier("userExecutor")
    private UserExecutor userExecutor;


    @Override
    public UserOutput userOperation(UserInput userInput, UserOutput userOutput) {
        // How to @Autowire UserExecutor with  userInput, userOutput comming in service parameter.

                //IExecutor executor = new UserExecutor(userInput, userOutput);
    //return (UserOutput) executor.execute();
    }
}

【问题讨论】:

  • 我相信你应该能够在 UserExecutor 中引入一个默认构造函数,并用自动连接字段替换你当前的构造函数参数。
  • 不 - 你是对的 - 它不会工作:)

标签: java spring


【解决方案1】:

您在UserExecutor 构造函数中缺少@Autowired。以下将起作用:

@Repository("userExecutor")
public class UserExecutor extends AbstractExecutor {
  @Autowired
  public UserExecutor(@Qualifier("userInput") UserInput input
    , @Qualifier("userOutput") UserOutput output) { super(input, output); }
}

Github 上提供的工作代码。


您还将受益于使用泛型。

public interface IInput {}
public interface IOutput {}

public interface IExecutor<I extends IInput, O extends IOutput> {
  O execute(I i);
}

public class AbstractExecutor<I extends IInput, O extends IOutput>
       implements IExecutor<I, O> {
  private final I input;
  private final O output;

  protected AbstractExecutor(I input, O output) {
    this.input = input;
    this.output = output;
  }

  public O execute(I i) {
    ...
  }
}

@Component
public class UserInput implements IInput {}
@Component
public class UserOutput implements IOutput {}
@Repository
public class UserExecutor extends AbstractExecutor<UserInput, UserOutput> {
  @Autowired
  public UserExecutor(UserInput input, UserOutput output) {
    super(input, output);
  }
}

public interface IUserService {
  UserOutput execute(UserInput input, UserOutput output);
}

@Service
public UserService implements IUserService {
  private final UserExecutor executor;

  @Autowired
  public UserService(UserExecutor executor) {
    this.executor = executor;
  }

  public UserOutput execute(UserInput input) {
    return executor.execute(input);
  }
}

您将避免在任何地方使用@QualifierObject 和类型转换。

【讨论】:

  • 嗨,Manish,感谢您的回复。 UserExecutor 正在使用 UserInput 和 UserOutput 的默认实例创建(属性为空)。但我想要的是 UserExecutor 的实例应该使用我在 UserInput 和 UserOutput 中设置的属性创建。我有控制器层,其中 UserInput 和 UserOutput 对象可用,其中包含自定义属性。我想用控制器层提供的 UserInput 和 UserOutput 创建 UserExecutor。谢谢,拉维
  • set by me 表示您将在runtime 创建不同的对象。另一方面,Spring 管理的构造函数在应用程序初始化时被调用(通常只调用一次)。因此,您不能使用您在帖子中提供的代码在运行时使用objects populated by me create 一个 Spring 管理的 bean 实例。您必须将@Scope("SCOPE_PROTOTYPE") 添加到UserExecutor,然后以applicationContext.getBean(UserExecutor.class, userInput, userOutput) 的形式获取其实例,其中userInputuserOutput 是您提供的bean。
猜你喜欢
  • 1970-01-01
  • 2014-01-07
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
相关资源
最近更新 更多