春季-我应该在这些域类上使用依赖注入吗?

前端之家收集整理的这篇文章主要介绍了春季-我应该在这些域类上使用依赖注入吗? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在以下示例中,我是否使用依赖项注入:

@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会使逻辑更加复杂?

最佳答案
如果没有依赖项注入,则可以将域对象视为贫血对象,这可以说是一种反模式.如果没有数据结构,而没有相关的行为,那么您将失去OO的许多好处.例如,要评估Order.isValid(),您可能需要注入一些依赖项以执行验证.

您可以使用以下方法在Spring容器上下文之外的类上进行依赖项注入:

@Configurable 

然后,您将bean的配方声明为原型,Spring将使用AOP修饰构造函数并查找所需的依赖项. .即使它查找依赖项,对您的最终效果还是依赖项注入,因为您只需更改一行就可以注入其他可评估Order.isValid()的东西.

这样,当您执行新订单或从持久性工厂获取订单时,该订单已具有“已注入”依赖项.

为此,需要aspectJ编织,而不仅仅是Proxy / CGLib编织,这是默认设置.您可以通过Java代理使用运行时编织,也可以使用构建时编织. . .我建议前者进行集成测试,而后者则进行部署. . .

服务与域对象:

既然您可以选择富域对象,那么问题就变成了放置内容的位置.服务还是实体?我的看法是,服务应基于可重用的域对象来协调特定于用例的过程.该服务是外部订户进入您系统的非OO网关.

. . Google Spring @Configurable,以获取有关基于AspectJ的域类依赖注入的更多信息和教程.

猜你在找的Spring相关文章