Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring 为什么要使用@Autowire_Spring_Spring Boot_Spring Mvc - Fatal编程技术网

Spring 为什么要使用@Autowire

Spring 为什么要使用@Autowire,spring,spring-boot,spring-mvc,Spring,Spring Boot,Spring Mvc,我刚接触Spring,因此我对它的理解非常肤浅,不过,假设我们正在看以下示例: class serviceImpl implements service{ @Autowired private Mapper mapper; public void executeService(){ mapper.executeSerice(); } } 因此,我尝试构建一些服务,从持久性级别调用mapperMapper是一个抽象类。因此,据我所知,@Autowi

我刚接触Spring,因此我对它的理解非常肤浅,不过,假设我们正在看以下示例:

class serviceImpl implements service{
    @Autowired
    private Mapper mapper;
    public void executeService(){
        mapper.executeSerice();
    }
}
因此,我尝试构建一些服务,从持久性级别调用mapper
Mapper
是一个抽象类。因此,据我所知,
@Autowired
将在此处自动注入一个
映射器的实现

那么我的问题是:

  • 如果有多个
    映射器的实现怎么办?经过一些搜索之后,在本例中,似乎需要使用
    @Qualifier
    来指定要使用的实现

  • 假设我们使用的是powerfulMapper实现,那么我们需要使用@Qualifier('powerfulMapper')


  • 那么,这与仅在此处实例化映射器powerfulMapper有何不同?

    如果只有一个映射器,则只需
    @Autowired
    即可注入。如果有多个映射器实现注册为Springbean,则必须使用
    @Qualifier
    @Resource
    告诉Spring要注入哪个实现。有关更多详细信息,请参阅

    那么这与仅仅实例化映射器有什么不同呢 这里是powerfulMapper吗

    不同之处在于,如果一个类是Springbean,我们可以对其应用一些Spring特性,例如:

    • 对其应用一些AOP魔术,例如
      @Async
      @Transactional
      @PreAuthorize

    • 考虑这样一种情况,如果一个类有很多依赖项,而这些依赖项又有很多,那么创建这个类的实例并配置整个依赖关系图并不是一件愉快的事情。更不用说不同的依赖项可能有不同的需求(例如,一个可能需要实例化为单例,并将被共享以供不同的类使用,而另一个可能需要在原型范围内,不同的类需要单独的实例等)

    使用
    @Autowired
    并让spring配置这种依赖关系图比手动配置要容易得多


    另一方面,如果映射器具有非常简单的依赖项,仅在
    serviceinpl
    内部使用,并且您不需要spring为其提供任何好处,那么您可以简单地实例化它,而不将其声明为Springbean

    如果只有一个映射器,则只需
    @Autowired
    注入即可。如果有多个映射器实现注册为Springbean,则必须使用
    @Qualifier
    @Resource
    告诉Spring要注入哪个实现。有关更多详细信息,请参阅

    那么这与仅仅实例化映射器有什么不同呢 这里是powerfulMapper吗

    不同之处在于,如果一个类是Springbean,我们可以对其应用一些Spring特性,例如:

    • 对其应用一些AOP魔术,例如
      @Async
      @Transactional
      @PreAuthorize

    • 考虑这样一种情况,如果一个类有很多依赖项,而这些依赖项又有很多,那么创建这个类的实例并配置整个依赖关系图并不是一件愉快的事情。更不用说不同的依赖项可能有不同的需求(例如,一个可能需要实例化为单例,并将被共享以供不同的类使用,而另一个可能需要在原型范围内,不同的类需要单独的实例等)

    使用
    @Autowired
    并让spring配置这种依赖关系图比手动配置要容易得多

    另一方面,如果映射器具有非常简单的依赖项,仅在
    serviceinpl
    内部使用,并且您不需要spring为其提供任何好处,那么您可以简单地实例化它,而不将其声明为Springbean

    依赖项注入(DI)可以避免复杂的依赖项树

    Imagen具有树状结构,其中a实例化B类,B类实例化C类,然后a实例化D,D实例化E

    A --> B ---> C
     \
      \--> D ---> E
    
    这一切都很好,直到E班需要C班

    然后我们需要重新安排所有内容,并向上实例化C,然后通过类B和D向下传递到两侧

    这就是DI发挥作用的地方

    相反,我们决定A实例化所有类

    A --> B
      --> C
      --> D
      --> E
    
    所以A是所有类的所有者,然后他可以将任何类传递给任何类,以满足任何类的任何需求

    这就是
    Spring上下文在
    @Autowire
    注释的帮助下所做的。为spring声明希望在实例化类中传递的类。然后,Spring在启动期间将实例化所有类,然后确定应该在何处安装哪个类(这是大规模的简化)。默认情况下,所有类都将实例化为单例(但这可以自定义)

    当spring实例化类时,它被称为
    spring管理的bean
    。Spring管理it的生命周期。不是您,因为您没有使用
    new
    ,所以框架是

    在这个过程中,Spring进行了大量的检查,并按照特定的顺序进行实例化,首先是配置类,然后是
    @Bean
    注释类,最后是
    @Component
    @Service
    等(此处过于简化),它将扫描应该实例化的类,它将决定首先实例化的顺序,然后将哪些类
    @自动连接到哪些类中。在这个阶段,有许多帮助注释将帮助Spring

    @Qualifier
    是一个,您基本上命名了一个类,然后您可以告诉spring您想要它在哪里
    @Autowired

    如果您配置了两个单例,这将非常有用
    @Autowired
    @Qualifier("powerfulMapper")
    private Mapper mapper;