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如何用于上述场景的手动实例化呢?
答案 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创建并自动装配此服务。
同样值得注意的是,不推荐使用场注入(在我们的初始示例中使用)。原因是相同的用例:很难实例化(并合适地注入协作者)使用字段注入的类。在这方面,构造函数注入更好。