【问题标题】:When to use dependency Injection in spring mvc?什么时候在spring mvc中使用依赖注入?
【发布时间】:2021-09-05 07:12:32
【问题描述】:

我正在处理一个 Spring MVC 项目,我正在处理不同类型的服务,存储库,即用 @Service 和 @Repository 注释的类。我对几个问题感到困惑:

  • 什么时候使用@AutoWired注解?

    我见过使用这个的各种存储库:

      CourseRepository crepo=new CourseRepository();
    

    我也看到了这个

    @AutoWired
    private CourseRepository crepo;
    

    应该使用上述哪个选项来获取 服务类中的存储库?

  • 我可以将@AutoWired 用于未使用@Repository 注释的类或 @Service?

我是这个 java 世界的初学者。任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 是的,你可以使用@Autowired。
  • 使用 Spring,除非您正在初始化 Bean,否则您实际上不必使用“new”显式创建对象。您始终可以使用 Autowired 注释字段,如果您没有多个实现,Spring 将自动搜索实现并为您创建一个对象。在这种情况下,您将不得不使用@Qualifier。

标签: java spring spring-boot spring-mvc annotations


【解决方案1】:
  1. 你应该@Autowire 依赖而不是自己实例化它。这样做,服务和 repo 层将松散耦合。此外,如果依赖项是自动装配的,则可以轻松地将模拟存储库注入到服务的 JUnit 测试类中。总结一下,如下使用:

    @自动连线 私人 CourseRepository crepo;

  2. 未使用以下任何构造型注释进行注释的类将不会出现在 Spring 的 IoC(控制反转)容器中。因此,在没有使用以下任何注释注释的类中自动装配是没有意义的。

    @Component、@Controller、@Service、@Repository

【讨论】:

    【解决方案2】:

    依赖注入意味着框架是处理类实例化的框架,并且该类的对象将被注入到您需要它的类中(感谢@Autowired注解)。换句话说,您不需要使用 new 运算符自己实例化服务和存储库类,您只需要告诉框架需要注入这些类,这就是您使用 @Autowired 注解的原因。

    【讨论】:

      【解决方案3】:

      您将new 用于数据对象,这在大多数现代架构中是被动的(它们不是“主动记录”)。其他一切都是服务对象,你应该注入它们。 (您确实使用new 的一个地方是使用@Bean 方法,这是一个创建服务对象的“工厂”;在这种情况下,您通常将依赖项作为方法参数传递。)

      注意,建议使用构造函数注入,而不是字段注入;它使您的代码更易于测试,并消除了某些类型错误的可能性。实际上,如果使用构造函数注入,则根本不需要在您的服务类中使用任何 Spring 注解;可以在配置类上使用@Import 指令或@Bean 方法注册bean。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-03
        • 2021-02-24
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        相关资源
        最近更新 更多