2016-02-09 1 views
0

Я столкнулся с странной проблемой, когда Component с инжекцией @Autowire доступен в одном классе, но не в другом.пружина - компонент, автоподъёмный в одном классе, но не в другом

Я использую @Autowired в атрибуте network классов Account и Agreement, но autowired только в классе Agreement, но не в Account. @ComponentScan управляет тремя необходимыми пакетами.

Вот начало класс:

package com.ser.pm.tests; 

@SpringBootApplication 
@ComponentScan("com.ser.pm.agreement, com.ser.pm.network, com.ser.pm.address") 
public class zt_Agreement { 

    public static void main(String[] args) throws SignatureException, InterruptedException { 

      ApplicationContext ctx = SpringApplication.run(zt_Agreement.class, args); 

      Agreement oagreement = ctx.getBean(Agreement.class); 

      oagreement.SubmitAgreement(); 

    } 
} 

Вот ComponentNetwork, который должен быть введен в Account ->network слишком

package com.ser.pm.network; 

@Component 
public class Network implements INetwork { 

    public X2network xsnetwork; 

    public Network() { xsnetwork = networkFactory.createnetwork(); } 

    public boolean isBound() { return (xsnetwork != null); } 

    public BigInteger getNumber(byte[] addr) { return xsnetwork.getNumber(addr); } 

} 

В этом классе поле network не autowired :

package com.ser.pm.address; 

@Component 
public class Account implements IFSAccount { 

    @Autowired 
    Network network; 

    public Account(String ir_Address, String ir_Name) {} 

    public Account() {} 


    public BigInteger getNumber() { 
     return network.getNumber(Hex.decode(this.getAddress())); 
    } 

} 

В этом классе поле network является autowired правильно

package com.ser.pm.agreement; 

@Component 
public class Agreement { 

    protected Account oFSEthAddress; 

    private Trans oTx; 

    private AgreementABI oABIs; 

    @Autowired 
    Network network; 

    @Autowired 
    private ApplicationContext ctx; 

    public Agreement() { 
     oFSEthAddress  = new Account(); 
     oagreementAccountOil = new FSEthagreementAccount(); 

    } 


    public Trans JoinAgreement(String iPrivateKey) throws FScx { 

     FSNetGas oFSEthNetGas = new FSNetGas(); 

     oFSEthAddress.setEtherum(oNetwork.onetwork); 

     SCTrans oFSTx = new FSTrans(); 

     oFSTx.createCallTrans(_oTxParams); 
     oFSTx.submit(oNetwork.onetwork); 

     return oFSTx.getTrans(); 

    } 

} 

Классы Account и Agreement находится в разных пакетах, но оба они сканируются с @ComponentScan, поэтому я не понимаю, почему у меня есть проблемы с автоматическим связыванием в класс Account?

+1

Вы создаете новый экземпляр самостоятельно в конструкторе ... Этот экземпляр ISN управляется весной и, как таковая, не получит никаких зависимостей. –

ответ

2

Вы не используете пружину, чтобы получить экземпляр счета - так весной не получил шанс autowire .Так линию:

oFSEthAddress  = new Account(); 
+0

, но если я пометю учетную запись класса @Component, то Spring должен создать объект bean, или я ошибаюсь? –

+0

Если весна создает компонент, он будет автоматически определять зависимость. Однако вы создали с помощью нового оператора, поэтому этот компонент не управляется весенним контейнером - пружина не может автоустанавливать его –

+0

, что означает, что я создал один компонент, который Spring не знает об этом. Но Spring еще нужно создать еще один Bean, потому что класс Account аннотируется с @Component, правильно? Или Spring не создает beans, если объект класса уже создан? Извините за вопрос новичка –