2016-09-18 115 views
0

如何使用自定義構造函數參數在Spring中創建Autowire?以下是我的示例代碼。我越來越無法autowire字段;沒有默認構造函數找到errors.I不能引入默認構造函數,因爲AbstractExecutor類沒有默認構造函數。如何使用自定義構造函數參數創建Autowire

IExecutor

public interface IExecutor { 
    Object execute(); 
} 

AbstractExecutor

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; 
     } 
    } 
} 

UserExecutor

@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 { } 

UserInput

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

UserOutput

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

UserServiceImpl

@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(); 
    } 
} 
+0

我相信你應該能夠在UserExecutor中引入一個默認構造函數,並用自動連線字段替換你當前的構造函數參數。 –

+0

不 - 你是對的 - 它不會工作:) –

回答

1

你失蹤@Autowired構造函數爲UserExecutor。以下將工作:

@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和類型鑄造無處不在。

+0

嗨Manish, 感謝您的答覆。 UserExecutor使用UserInput和UserOutput的默認實例創建(屬性爲空)。 但我想要的是UserExecutor的實例應使用UserInput和UserOutput中由我設置的屬性創建。 我有控制器層的UserInput和UserOutput對象可用與自定義屬性。 我想用控制器層提供的UserInput和UserOutput創建UserExecutor。 謝謝, Ravi – ravi

+0

'由我設置'意味着你將在'runtime'創建不同的對象。另一方面,Spring的託管構造函數在應用程序初始化時被調用(通常只有一次)。因此,您不能在運行時使用您在帖子中提供的代碼「創建」一個由'我填充的對象'的Spring管理的bean實例。您必須將'@Scope(「SCOPE_PROTOTYPE」)''添加到'UserExecutor',然後將其實例獲得爲'applicationContext.getBean(UserExecutor.class,userInput,userOutput)',其中'userInput'和'userOutput'爲bean供應。 – manish

相關問題