当前位置: 首页 > article >正文

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.执行测试方法

a85e72788ab2471b998da6a734f1d658.png

异常信息描述: 没有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当中 所采用的方式

 

 

 


http://www.kler.cn/a/323456.html

相关文章:

  • 微信小程序:vant组件库安装步骤
  • c++原型模式(Prototype Pattern)
  • C++ 的发展
  • 坚果云·无法连接服务器(无法同步)
  • ffmpeg视频编码
  • FingerprintSimilarity和BulkTanimotoSimilarity的区别
  • ML 系列:机器学习和深度学习的深层次总结(06)— 提升数据质量
  • 数通。。。
  • uniapp js向json中增加另一个json的全部数据,并获取json长度
  • 【分布式微服务云原生】Dockerfile命令详解
  • 一站式家装服务管理系统
  • day01——通过git进行管理项目
  • HarmonyOS鸿蒙系统开发应用程序,免费开源DevEco Studio开发工具
  • 【中间件——基于消息中间件的分布式系统的架构】
  • C语言开发基础新手快速入门及精通系列学习教程(系统性完整C语言学习笔记整理)
  • Android常用C++特性之std::unique
  • 接口报错500InvalidPropertyException: Invalid property ‘xxx[256]‘,@InitBinder的使用
  • Python编程:08- pycharm使用技巧
  • OpenSource - 开源WAF_SamWaf
  • 详解Ajax与axios的区别
  • 增强现实中的物体识别与跟踪
  • rocketmq 学习文档
  • Vue3(五) 组件通信大汇总
  • 学习记录:js算法(四十八):另一棵树的子树
  • 【C++】Eclipse技巧汇总
  • Codeforces Round 975 (Div. 2) A. Max Plus Size