Spring 我应该在这些域类上使用依赖项注入吗?

Spring 我应该在这些域类上使用依赖项注入吗?,spring,dependency-injection,Spring,Dependency Injection,我是否在以下示例中使用依赖项注入: @Scope("prototype") @Component public class Order{ @Autowired public Order(User user,List<OrderItem> items,.......){ @范围(“原型”) @组成部分 公共阶级秩序{ @自动连线 公共秩序(用户、列表项等){ 现在在别的地方: @Component public class PersistOrder{ @Au

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

@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();
@组件
公共秩序{
@自动连线
供应商订单供应商;
公共无效准备订单(){
Order=orderProvider.get();
正如JSR-330所述,的get()方法返回一个新的Order实例,但是什么对象被传递给新Order的构造函数呢?正如您所看到的,Order有自己的依赖项,在将实际的Order对象检索到该方法之前必须注入这些依赖项

如果没有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);
@组件
公共秩序{
公共无效准备订单(){
User=userDao.get(userId);
List orderItems=orderItemDao.getAll(orderItemIds);
订单=新的SmartPhoneOrder(用户、订单项);

如您所见,我有用户和订单项的ID,可以从DAO获取它们的实例。然后我将这些实例传递给订单子类的构造函数以获取实例。这个过程对我来说非常清楚。我的意思是,我如何使用DI来完成这项工作,从而使我的代码能够享受PersistOrder和order类之间的解耦?或者在t中使用DI他的例子使逻辑更加复杂?

如果没有依赖注入,域对象可能会被视为贫乏的,这可以说是一种反模式。由于拥有数据结构,没有相关行为,您正在失去OO的许多好处。例如,评估Order.isValid()您可能需要注入一些依赖项来执行验证

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

@Configurable 
然后,您将bean的配方声明为原型,Spring将使用AOP swizzle构造函数并查找所需的依赖项..即使它查找依赖项,对您的净影响是依赖项注入,因为您只需更改一行即可注入其他计算Order.isValid()的内容

这样,当您创建新订单或从持久性工厂获取订单时,它已经“注入”了依赖项

要做到这一点,需要aspectJ编织,而不仅仅是代理/CGLib编织,这是默认的。您可以使用Java代理运行时编织或构建时编织…我建议前者用于集成测试,后者用于部署

服务与域对象:

既然您可以选择富域对象,那么问题就变成了将东西放在哪里。服务与实体?我的观点是,该服务应该基于可重用的域对象协调一个特定于用例的过程。该服务是外部订阅者进入您系统的非OO网关


…Google Spring@Configurable可获得更多关于基于AspectJ的域类依赖注入的信息和教程。

我认为您将订单与订单服务混为一谈。您通常会将用户传递给一个返回用户订单的服务,并且您会在呼叫时这样做。实际上,我已经简化了示例。是的,服务e的prepareOrder()具有从视图中提供的参数,但它不会改变概念。假设我对有意义的订单的所有必要对象(如用户、项目等)都有引用。但我仍然必须将它们传递给订单的构造函数。这是个问题,因为当我调用get()时,spring负责实例化新订单我已经编辑了这个问题并删除了对我的服务的提及。现在我认为这个问题不再那么令人困惑,因为你可以使用这个项目。免责声明。我是作者。