赞
踩
@ComponentScan组件扫描
- @SpringBootApplication
- @ComponentScan({"com.itheima","com.example"}) //指定要扫描的包
- public class SpringbootWebConfig2Application {
- public static void main(String[] args) {
- SpringApplication.run(SpringbootWebConfig2Application.class, args);
- }
- }
重新执行测试方法,控制台日志输出:
大家可以想象一下,如果采用以上这种方式来完成自动配置,那我们进行项目开发时,当需要引入大量的第三方的依赖,就需要在启动类上配置N多要扫描的包,这种方式会很繁琐。而且这种大面积的扫描性能也比较低。
缺点:
使用繁琐
性能低
结论:SpringBoot中并没有采用以上这种方案。
@Import导入
导入形式主要有以下几种:
导入普通类
导入配置类
导入ImportSelector接口实现类
1). 使用@Import导入普通类:
- @Import(TokenParser.class) //导入的类会被Spring加载到IOC容器中
- @SpringBootApplication
- public class SpringbootWebConfig2Application {
- public static void main(String[] args) {
- SpringApplication.run(SpringbootWebConfig2Application.class, args);
- }
- }
重新执行测试方法,控制台日志输出:
2). 使用@Import导入配置类:
配置类
- @Configuration
- public class HeaderConfig {
- @Bean
- public HeaderParser headerParser(){
- return new HeaderParser();
- }
-
- @Bean
- public HeaderGenerator headerGenerator(){
- return new HeaderGenerator();
- }
- }
启动类
- @Import(HeaderConfig.class) //导入配置类
- @SpringBootApplication
- public class SpringbootWebConfig2Application {
- public static void main(String[] args) {
- SpringApplication.run(SpringbootWebConfig2Application.class, args);
- }
- }
测试类
- @SpringBootTest
- public class AutoConfigurationTests {
- @Autowired
- private ApplicationContext applicationContext;
-
- @Test
- public void testHeaderParser(){
- System.out.println(applicationContext.getBean(HeaderParser.class));
- }
-
- @Test
- public void testHeaderGenerator(){
- System.out.println(applicationContext.getBean(HeaderGenerator.class));
- }
-
- //省略其他代码...
- }
执行测试方法:
3). 使用@Import导入ImportSelector接口实现类:
ImportSelector接口实现类
- public class MyImportSelector implements ImportSelector {
- public String[] selectImports(AnnotationMetadata importingClassMetadata) {
- //返回值字符串数组(数组中封装了全限定名称的类)
- return new String[]{"com.example.HeaderConfig"};
- }
- }
启动类
- @Import(MyImportSelector.class) //导入ImportSelector接口实现类
- @SpringBootApplication
- public class SpringbootWebConfig2Application {
-
- public static void main(String[] args) {
- SpringApplication.run(SpringbootWebConfig2Application.class, args);
- }
- }
-
执行测试方法:
我们使用@Import注解通过这三种方式都可以导入第三方依赖中所提供的bean或者是配置类。
思考:如果基于以上方式完成自动配置,当要引入一个第三方依赖时,是不是还要知道第三方依赖中有哪些配置类和哪些Bean对象?
答案:是的。 (对程序员来讲,很不友好,而且比较繁琐)
思考:当我们要使用第三方依赖,依赖中到底有哪些bean和配置类,谁最清楚?
答案:第三方依赖自身最清楚。
结论:我们不用自己指定要导入哪些bean对象和配置类了,让第三方依赖它自己来指定。
怎么让第三方依赖自己指定bean对象和配置类?
比较常见的方案就是第三方依赖给我们提供一个注解,这个注解一般都以@EnableXxxx开头的注解,注解中封装的就是@Import注解
4). 使用第三方依赖提供的 @EnableXxxxx注解
第三方依赖中提供的注解
- @Retention(RetentionPolicy.RUNTIME)
- @Target(ElementType.TYPE)
- @Import(MyImportSelector.class)//指定要导入哪些bean对象或配置类
- public @interface EnableHeaderConfig {
- }
在使用时只需在启动类上加上@EnableXxxxx注解即可
- @EnableHeaderConfig //使用第三方依赖提供的Enable开头的注解
- @SpringBootApplication
- public class SpringbootWebConfig2Application {
- public static void main(String[] args) {
- SpringApplication.run(SpringbootWebConfig2Application.class, args);
- }
- }
执行测试方法:
以上四种方式都可以完成导入操作,但是第4种方式会更方便更优雅,而这种方式也是SpringBoot当中所采用的方式。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。