gpt4 book ai didi

java - 如何使用自定义构造函数参数创建 Autowire

转载 作者:行者123 更新时间:2023-12-01 09:29:35 26 4
gpt4 key购买 nike

如何在 Spring 中使用自定义构造函数参数创建 Autowire?以下是我的示例代码。我收到 Could not autowire field;没有发现默认构造函数错误。我无法引入默认构造函数,因为 AbstractExecutor 类没有默认构造函数。

IE执行器

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 }

用户服务Impl

@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 构造函数中缺少 @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和类型转换。

关于java - 如何使用自定义构造函数参数创建 Autowire,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39557312/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com