在以下示例中,我是否使用依赖项注入:
@Scope("prototype")
@Component
public class Order{
@Autowired
public Order(User user,List<OrderItem> items,.......){
现在其他地方:
@Component
public class PersistOrder{
@Autowired
Provider<Order> orderProvider;
public void prepareOrder() {
Order order = orderProvider.get();
根据JSR-330的规定,Provider的get()方法返回Order的新实例,但是哪些对象传递给了新Order的构造函数?如您所见,订单具有其自己的依赖关系,在将实际的订单对象检索到方法之前,必须将其注入.
如果没有DI,我只需创建所有必要的参数,然后将它们传递给新顺序的构造函数即可.那我应该在这里使用DI吗?
编辑:
这是没有DI的代码的样子:
@Component
public class PersistOrder{
public void prepareOrder() {
User user=userDao.get(userId);
List<OrderItem> orderItems=orderItemDao.getAll(orderItemIds);
Order order = new SmartPhoneOrder(user,orderItems);
如您所见,我具有用户名和订单项的ID,可以从DAO获取它们的实例.然后,将这些实例传递给Order的子类的构造函数以获取实例.这个过程对我来说似乎很清楚.我的意思是我该如何使用DI来使我的代码享受PersistOrder和Order类之间的解耦?还是在此示例中使用DI会使逻辑更加复杂?
您可以使用以下方法在Spring容器上下文之外的类上进行依赖项注入:
@Configurable
然后,您将bean的配方声明为原型,Spring将使用AOP修饰构造函数并查找所需的依赖项. .即使它查找依赖项,对您的最终效果还是依赖项注入,因为您只需更改一行就可以注入其他可评估Order.isValid()的东西.
这样,当您执行新订单或从持久性工厂获取订单时,该订单已具有“已注入”依赖项.
为此,需要aspectJ编织,而不仅仅是Proxy / CGLib编织,这是默认设置.您可以通过Java代理使用运行时编织,也可以使用构建时编织. . .我建议前者进行集成测试,而后者则进行部署. . .
服务与域对象:
既然您可以选择富域对象,那么问题就变成了放置内容的位置.服务还是实体?我的看法是,服务应基于可重用的域对象来协调特定于用例的过程.该服务是外部订户进入您系统的非OO网关.
. . Google Spring @Configurable,以获取有关基于AspectJ的域类依赖注入的更多信息和教程.