2017-03-19 1 views
1

ServiceInvokerImpl.java

Object lService = null; 
lService = Class.forName("com.test.AssetServiceImpl").newInstance(); 

AssetServiceImpl.java

public class AssetServiceImpl implements LogisticService { 

    @Autowired 
    private EntityLifeCycleManager entityLifeCycleManager; 


    @Override 
    @Transactional 
    public FetchResults findAsset(String cls, QueryDetail query, OperationProperties props) { 

     return entityLifeCycleManager.find("com.test.model.Asset", query, props); 
} 

質問内容

私はServiceInvokerImpl.javaAssetServiceImplをインスタンス化するとき、それはヌルとしてAssetServiceImpl.javaAutowiredプロパティentityLifeCycleManagerを示しています。では、上記のシナリオの手動インスタンス化でオートワイヤーがどのように機能しますか?マニュアルオブジェクトのインスタンシエーションでオートワイヤがどのように機能しますか?

+0

単に動作しません。春は、このオブジェクトが動作するためにはこのオブジェクトを認識する必要があります。 – myhau

答えて

1

@Autowiredは、管理対象インスタンス、つまり依存性注入コンテナ(@Autowiredの場合はSpring)によって作成されるオブジェクトインスタンスに対してのみ機能します。

あなただけの(基本的にnew演算子を使ってインスタンスを生成しと同じである)Class#getInstance()を起動するのであれば、@Autowiredは単に無視され、entityLifeCycleManagernullになります。その後、

public class AssetServiceImpl implements LogisticService { 

    private final EntityLifeCycleManager entityLifeCycleManager; 

    @Autowired 
    public AssetServiceImpl(EntityLifeCycleManager entityLifeCycleManager) { 
     this.entityLifeCycleManager = entityLifeCycleManager; 
    } 

    ... 

のいずれかnewオペレータとそれをインスタンス化します:

あなたはまだ(春ではなく)手動でインスタンス化する必要がある場合は、コンストラクタ・インジェクションを使用することができますし、手動で例えば、依存関係を供給

EntityLifeCycleManager entityLifeCycleManager = //.. somehow obtain an EntityLifeCycleManager instance 
LogisticService logisticService = new AssetServiceImpl(entityLifeCycleManager); 

またはClass経由:

EntityLifeCycleManager entityLifeCycleManager = //.. somehow obtain an EntityLifeCycleManager instance 
LogisticService logisticService = Class.forName("com.test.AssetServiceImpl").getConstructor(new Class[]{EntityLifeCycleManager.class}).newInstance(new Object[]{entityLifeCycleManager}); 

@Autowiredアノテーションはコンストラクタに移動され、このサービスは、あなたが望むならば、このサービスが作成され、autowiredできるようになります。

また、フィールド注入(私たちの最初の例で使用されています)はお勧めできません。その理由は、フィールド・インジェクションを使用するクラスをインスタンス化する(および共同作業者に適切に注入する)ことは困難です。この点でコンストラクタインジェクションが優れています。

関連する問題