autowire如何在手动对象实例化中工作?

时间:2017-03-19 17:58:22

标签: java spring hibernate spring-mvc

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

问题描述

当我在AssetServiceImpl中实例化ServiceInvokerImpl.java时,它会将Autowired的{​​{1}}属性entityLifeCycleManager显示为空。那么,autowire如何用于上述场景的手动实例化呢?

1 个答案:

答案 0 :(得分:1)

@Autowired仅适用于托管实例,即由依赖注入容器创建的对象实例(对于@Autowired,这是Spring)。

因此,如果您只调用Class#getInstance()(与使用new运算符进行实例化基本相同),则@Autowired将被忽略,entityLifeCycleManager将为{{1} }}

如果你仍然需要手动实例化它(而不是Spring),你可以使用构造函数注入并手动提供依赖项,例如:

null

然后使用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}); 注释会移动到构造函数中,如果您愿意,仍允许Spring创建并自动装配此服务。

同样值得注意的是,不推荐使用场注入(在我们的初始示例中使用)。原因是相同的用例:很难实例化(并合适地注入协作者)使用字段注入的类。在这方面,构造函数注入更好。