Java Web —— 第十天(SpringBoot原理)
SpringBoot框架之所以使用起来更简单更快捷,是因为SpringBoot框架底层提供了两个非常重要的 功能:一个是起步依赖,一个是自动配置。
通过SpringBoot所提供的起步依赖,就可以大大的简化pom文件当中依赖的配置,从而解决了 Spring框架当中依赖配置繁琐的问题。
通过自动配置的功能就可以大大的简化框架在使用时bean的声明以及bean的配置。我们只需要引 入程序开发时所需要的起步依赖,项目开发时所用到常见的配置都已经有了,我们直接使用就可以 了。
起步依赖
使用了SpringBoot,就不需要这么繁琐的引入依赖了。
我们只需要引入一个依赖就可以了,那就是web开发的起步依赖:springboot-starter-web
为什么我们只需要引入一个web开发的起步依赖,web开发所需要的所有的依赖都有了呢?
因为Maven的依赖传递。
结论:起步依赖的原理就是Maven的依赖传递。
自动配置
SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
分析自动配置原理
1.准备工作:在Idea中导入itheima-utils工程
2.在SpringBoot项目 spring-boot-web-config2 工程中,通过坐标引入itheima-utils依赖
<!--引入第三方提供的依赖-->
<dependency>
<groupId>com.example</groupId>
<artifactId>itheima-utils</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
3.在测试类中,添加测试方法
@SpringBootTest
public class AutoConfigurationTests {
@Autowired
private ApplicationContext applicationContext;
@Test
public void testTokenParse(){
System.out.println(applicationContext.getBean(TokenParser.class));
}
}
4.执行测试方法
异常信息描述: 没有com.example.TokenParse类型的bean
说明:在Spring容器中没有找到com.example.TokenParse类型的bean对象
问题所在:
SpringBoot项目中的@SpringBootApplication注解,具有包扫描的作用,但是它只会扫描启 动类所在的当前包以及子包。
方案1:@ComponentScan 组件扫描
@SpringBootApplication
@ComponentScan({"com.itheima","com.example"}) //指定要扫描的包
public class SpringbootWebConfig2Application {
public static void main(String[] args) {
SpringApplication.run(SpringbootWebConfig2Application.class,args);
}
}
缺点: 1. 使用繁琐 2. 性能低
方案2:@Import 导入
(使用@Import导入的类会被Spring加载到IOC容器中)
使用@Import导入普通类:
@Import(TokenParser.class) //导入的类会被Spring加载到IOC容器中
使用@Import导入配置类:
配置类
@Configuration
public class HeaderConfig {
@Bean
public HeaderParser headerParser(){
return new HeaderParser();
}
@Bean
public HeaderGenerator headerGenerator(){
return new HeaderGenerator();
}
启动类
@Import(HeaderConfig.class) //导入配置类
测试类
@SpringBootTest
public class AutoConfigurationTests {
@Autowired
private ApplicationContext applicationContext;
@Test
public void testHeaderParser(){
System.out.println(applicationContext.getBean(HeaderParser.class));
}
@Test
public void testHeaderGenerator(){
使用@Import导入ImportSelector接口实现类
ImportSelector接口实现类
public class MyImportSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.example.HeaderConfig"};
}
}
启动类
@Import(MyImportSelector.class) //导入ImportSelector接口实现类
第三方依赖中提供的注解*
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)
public @interface EnableHeaderConfig {
}
启动类
@EnableHeaderConfig //使用第三方依赖提供的Enable开头的注解
这种方式也是SpringBoot当中 所采用的方式