【问题标题】:Spring dependency injection to a class with a constructor带有构造函数的类的Spring依赖注入
【发布时间】:2016-10-08 09:13:02
【问题描述】:

我对整个 spring 依赖注入有点陌生。 有一件事我不明白,希望有人能为我解决这个问题......

我有一个服务:

@Service
public class Service {...}

还有一个班级:

public class A{
   @Autowired
   private Service service;
   ...
}

在这种情况下,Service 将按预期注入到类 A 中。 据我所知,你不能在 A 类中使用构造函数,否则注入将不起作用。有没有办法在 A 类中使用构造函数并同时注入 Service? 即:

public class A{
       @Autowired
       private Service service;

       private String a;
       private int b;
       public A(String a,int b){
        this.a = a;
        this.b = b;
       }
    }

在这种情况下,我得到的服务是空的,无论如何要解决这个问题? 我希望能够使用注入 Service 的“new”从类型 A 创建一个对象,这可能吗?

谢谢。

【问题讨论】:

    标签: java spring spring-mvc dependency-injection


    【解决方案1】:

    重要的是你的两个类都应该是 Spring bean。

    这反过来意味着所有的实例化都将由 Spring 容器完成。要了解如何正确处理基于构造函数的依赖注入,请查看ref doc

    如果无论如何,您不能将类A 设为Spring bean,推荐的方法是使用@Configurable 对其进行注释,这将自动关联创建时间的依赖关系。

    请注意,为此,您需要启用方面。我快速搜索了一下,发现这个blog 似乎很好地解释了细节

    【讨论】:

    • 这个有方面的东西看起来更像是一个黑客。有更好的方法吗?此问题可能出现在您拥有所谓的域对象(处理业务逻辑)以及需要从该域对象中访问服务的情况下。或者用 DDD 术语来说 - 如何访问应用程序服务(作为 Spring 处理) bean)来自域服务(使用new 创建)?
    【解决方案2】:

    有。您应该在 Spring 配置类中手动创建服务类的实例(使用 @Configuration 注释),并使用 @Service 而不是类来注释创建实例的方法。

    因此,例如,您的应用程序可能具有如下所示的 Spring 配置:

    @Configuration
    public class MyApplicationConfig {
        @Bean
        public Service myService() {
            return new Service("hello", "world", 42); // ctor args as an example
        }
    }
    

    还有你的服务等级:

    // need fully qualified class because your class has the same name
    @org.springframework.stereotype.Service
    public class Service {
        public Service(String prefix, String suffix, int number) {
            // Whatever
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多