当前位置:   article > 正文

Javaweb之SpringBootWeb案例之自动配置的两种常见方案的详细解析

Javaweb之SpringBootWeb案例之自动配置的两种常见方案的详细解析
3.2.2.2 方案一

@ComponentScan组件扫描

  1. @SpringBootApplication
  2. @ComponentScan({"com.itheima","com.example"}) //指定要扫描的包
  3. public class SpringbootWebConfig2Application {
  4.    public static void main(String[] args) {
  5.        SpringApplication.run(SpringbootWebConfig2Application.class, args);
  6.   }
  7. }

重新执行测试方法,控制台日志输出:

大家可以想象一下,如果采用以上这种方式来完成自动配置,那我们进行项目开发时,当需要引入大量的第三方的依赖,就需要在启动类上配置N多要扫描的包,这种方式会很繁琐。而且这种大面积的扫描性能也比较低。

缺点:

  1. 使用繁琐

  2. 性能低

结论:SpringBoot中并没有采用以上这种方案。

3.2.2.3 方案二

@Import导入

  • 导入形式主要有以下几种:

    1. 导入普通类

    2. 导入配置类

    3. 导入ImportSelector接口实现类

1). 使用@Import导入普通类:

  1. @Import(TokenParser.class) //导入的类会被Spring加载到IOC容器中
  2. @SpringBootApplication
  3. public class SpringbootWebConfig2Application {
  4.    public static void main(String[] args) {
  5.        SpringApplication.run(SpringbootWebConfig2Application.class, args);
  6.   }
  7. }

重新执行测试方法,控制台日志输出

2). 使用@Import导入配置类:

  • 配置类

  1. @Configuration
  2. public class HeaderConfig {
  3.    @Bean
  4.    public HeaderParser headerParser(){
  5.        return new HeaderParser();
  6.   }
  7.    @Bean
  8.    public HeaderGenerator headerGenerator(){
  9.        return new HeaderGenerator();
  10.   }
  11. }
  • 启动类

  1. @Import(HeaderConfig.class) //导入配置类
  2. @SpringBootApplication
  3. public class SpringbootWebConfig2Application {
  4.    public static void main(String[] args) {
  5.        SpringApplication.run(SpringbootWebConfig2Application.class, args);
  6.   }
  7. }
  • 测试类

  1. @SpringBootTest
  2. public class AutoConfigurationTests {
  3.    @Autowired
  4.    private ApplicationContext applicationContext;
  5.    @Test
  6.    public void testHeaderParser(){
  7.        System.out.println(applicationContext.getBean(HeaderParser.class));
  8.   }
  9.    @Test
  10.    public void testHeaderGenerator(){
  11.        System.out.println(applicationContext.getBean(HeaderGenerator.class));
  12.   }
  13.    
  14.    //省略其他代码...
  15. }

执行测试方法:

3). 使用@Import导入ImportSelector接口实现类:

  • ImportSelector接口实现类

  1. public class MyImportSelector implements ImportSelector {
  2.    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
  3.        //返回值字符串数组(数组中封装了全限定名称的类)
  4.        return new String[]{"com.example.HeaderConfig"};
  5.   }
  6. }
  • 启动类

  1. @Import(MyImportSelector.class) //导入ImportSelector接口实现类
  2. @SpringBootApplication
  3. public class SpringbootWebConfig2Application {
  4.    public static void main(String[] args) {
  5.        SpringApplication.run(SpringbootWebConfig2Application.class, args);
  6.   }
  7. }

执行测试方法:

我们使用@Import注解通过这三种方式都可以导入第三方依赖中所提供的bean或者是配置类。

思考:如果基于以上方式完成自动配置,当要引入一个第三方依赖时,是不是还要知道第三方依赖中有哪些配置类和哪些Bean对象?

  • 答案:是的。 (对程序员来讲,很不友好,而且比较繁琐)

思考:当我们要使用第三方依赖,依赖中到底有哪些bean和配置类,谁最清楚?

  • 答案:第三方依赖自身最清楚。

结论:我们不用自己指定要导入哪些bean对象和配置类了,让第三方依赖它自己来指定。

怎么让第三方依赖自己指定bean对象和配置类?

  • 比较常见的方案就是第三方依赖给我们提供一个注解,这个注解一般都以@EnableXxxx开头的注解,注解中封装的就是@Import注解

4). 使用第三方依赖提供的 @EnableXxxxx注解

  • 第三方依赖中提供的注解

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.TYPE)
  3. @Import(MyImportSelector.class)//指定要导入哪些bean对象或配置类
  4. public @interface EnableHeaderConfig {
  5. }
  • 在使用时只需在启动类上加上@EnableXxxxx注解即可

  1. @EnableHeaderConfig  //使用第三方依赖提供的Enable开头的注解
  2. @SpringBootApplication
  3. public class SpringbootWebConfig2Application {
  4.    public static void main(String[] args) {
  5.        SpringApplication.run(SpringbootWebConfig2Application.class, args);
  6.   }
  7. }

执行测试方法:

以上四种方式都可以完成导入操作,但是第4种方式会更方便更优雅,而这种方式也是SpringBoot当中所采用的方式。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/199214
推荐阅读
相关标签
  

闽ICP备14008679号