SpringBoot配置优先级

SpringBoot原理/bean管理_spring

命令行参数优先级高于Java系统属性。

SpringBoot原理/bean管理_spring_02

SpringBoot原理/bean管理_System_03

Bean管理

获取Bean

SpringBoot原理/bean管理_xml_04

SpringBoot原理/bean管理_xml_05

@Autowired
private ApplicationContext applicationContext; // IOC容器对象

@Test
public void testGetBean() {
    // 根据bean的名称获取
    DeptController bean1 = (DeptController) applicationContext.getBean("deptController");
    System.out.println(bean1);

    // 根据bean的类型获取
    DeptController bean2 = applicationContext.getBean(DeptController.class);
    System.out.println(bean2);

    // 根据bean的名称 和 类型获取
    DeptController bean3 = applicationContext.getBean("deptController", DeptController.class);
    System.out.println(bean3);
}

Bean的作用域

SpringBoot原理/bean管理_spring_06

SpringBoot原理/bean管理_System_07

@Scope("prototype")//作用域,默认是singleton,可以设置为prototype,每次请求都会创建一个新的实例
@Lazy//懒加载,默认是false,设置为true时,只有在第一次请求时才会创建实例

SpringBoot原理/bean管理_spring_08

第三方Bean

不能加@Component、@Contriller、@Service、@Repositive这几个注解

// 声明第三方bean
@Bean
public SAXReader saxReader() {
    return new SAXReader();
}

原始用法

// 第三方bean的管理
@Test
public void testThirdBean() throws Exception {
    SAXReader saxReader = new SAXReader();

    Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
    Element rootElement = document.getRootElement();
    String name = rootElement.element("name").getText();
    String age = rootElement.element("age").getText();

    System.out.println(name + " : " + age);
}

获取Bean对象

@Autowired
private SAXReader saxReader; // 第三方bean对象
// 第三方bean的管理
@Test
public void testThirdBean() throws Exception {
    //SAXReader saxReader = new SAXReader();

    Document document = saxReader.read(this.getClass().getClassLoader().getResource("1.xml"));
    Element rootElement = document.getRootElement();
    String name = rootElement.element("name").getText();
    String age = rootElement.element("age").getText();

    System.out.println(name + " : " + age);
}

1.xml

<?xml version="1.0" encoding="UTF-8"?>
<emp>
<name>Tom</name>
<age>18</age>
</emp>
  • JUnit框架:用于编写和运行测试用例,确保代码的功能正常。在这段代码中,它负责执行测试方法并报告测试结果。
  • Spring Boot框架:提供了依赖注入和配置管理功能,使得测试环境可以轻松管理和使用Spring管理的bean。通过@Autowired注解,开发者可以轻松获取需要测试的组件(如SAXReader)的实例。

SpringBoot原理/bean管理_spring_09

package com.example.springbootmybatis.config;

import org.dom4j.io.SAXReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CommonConfig {
    // 声明第三方bean
    @Bean
    public SAXReader saxReader() {
        return new SAXReader();
    }

}

SpringBoot原理/bean管理_spring_10

第一条

上面默认方法名就是saxReader

第二条

public SAXReader saxReader(DeptService deptService) {

Component和Bean注解使用场景

1. @Component

  • 作用@Component是一个通用的注解,用于标记一个类为Spring的组件。Spring会自动扫描带有此注解的类并注册为bean。
  • 使用场景:适用于自动化组件扫描,并在需要时自动注入。通常用于服务层、数据层、控制器等。
  • 常见的派生注解
  • @Service:标记一个服务类,通常用于业务逻辑。
  • @Repository:标记一个数据访问层的类,通常用于数据库操作。
  • @Controller:标记一个控制器类,通常用于处理HTTP请求。

2. @Bean

  • 作用@Bean注解用于方法上,表示该方法会返回一个Spring管理的bean。我们可以通过此注解将非Spring管理的类(如第三方库)作为bean来管理。
  • 使用场景:适用于需要对bean的创建过程进行更多控制的情况,例如配置外部库或进行条件装配。

Springboot原理

主要有两个框架,Springboot框架已经成为主流。

SpringBoot原理/bean管理_spring_11

原因

SpringBoot原理/bean管理_System_12

起步依赖原理

在Spring Boot中,起步依赖(Starter Dependencies)是一种简化项目配置和管理依赖的方式。它们的主要原理和作用包括以下几点:

1. 简化依赖管理

起步依赖将一组常用的、相关的库封装在一起,用户只需引入一个起步依赖,就能够通过maven传递自动引入该组依赖的所有库。例如:

  • spring-boot-starter-web:包含了开发Web应用所需的相关依赖,如Spring MVC、Tomcat等。

2. 版本控制

起步依赖通常在spring-boot-dependencies管理中定义了库的版本,使得在使用起步依赖时,所有相关依赖的版本都能够保持一致,避免因版本不匹配导致的问题。这减轻了维护者手动管理各个依赖版本的负担。

3. 预配置

起步依赖通常会带有对应的自动配置(Auto-Configuration)功能,这意味着当你在项目中引入某个起步依赖时,Spring Boot会自动根据类路径中的依赖来配置应用程序。例如,如果引入了spring-boot-starter-data-jpa,Spring Boot会自动配置数据源和JPA相关的设置。

4. 提高开发效率

通过使用起步依赖,开发者可以更快速地搭建项目,快速引入所需要的功能,而无需逐一添加和配置所有相关的依赖。

自动配置原理(面试题)

SpringBoot原理/bean管理_xml_13

Spring Boot的自动配置是其核心特性之一,旨在简化Spring应用的配置过程。它通过约定优于配置的原则,自动配置Spring应用所需的bean。在这里,我将详细介绍自动配置的原理。

1. 条件配置(Conditional Configuration)

SpringBoot原理/bean管理_spring_14

SpringBoot原理/bean管理_spring_15

自动配置依赖于一系列的条件注解,例如:

  • @ConditionalOnClass:当某个类在类路径上时,自动配置启用。
  • @ConditionalOnMissingBean:当容器中缺少某个bean时,自动配置启用。
  • @ConditionalOnProperty:根据配置文件中的属性来判断是否启用自动配置。

2. 自动配置类

自动配置的核心是位于spring-boot-autoconfigure模块中的一系列自动配置类,这些类通常使用@Configuration注解标记,并通过条件注解进行配置。在这些类中,定义了大量的第三方库和Spring组件的默认配置。

例如,DataSourceAutoConfiguration会根据存在的数据库驱动和配置属性来自动创建DataSource bean。

3. Spring.factories 文件

Spring Boot的自动配置通过spring.factories文件进行注册。这个文件位于META-INF目录下,列出了所有自动配置类。Spring Boot在启动时会扫描此文件,加载并应用其中列出的所有自动配置类。

示例:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfigure.ExampleAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

4. 优先级与排除

Spring Boot支持通过@EnableAutoConfiguration注解的exclude属性来排除某些自动配置。例如:

@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})

这可以让开发者在需要时精细控制启用或禁用特定的自动配置。

5. 配置文件

Spring Boot允许使用application.propertiesapplication.yml文件来覆盖自动配置的默认属性,以实现定制化。

6. 自定义自动配置

开发者也可以创建自己的自动配置,实现公司或项目特定的配置,方法是创建一个新的@Configuration类并添加到spring.factories文件中。

7.手动扫描

SpringBoot原理/bean管理_xml_16

当导入不在SpringBootApplication范围内的包时,使用手动扫描来配置。

@ComponentScan注解用于指定Spring应该扫描的包,以查找带有@Component@Service@Repository@Controller等注解的类并将其注册为bean。

@ComponentScan(basePackages = "com.example.myapp") // 指定扫描的包

SpringBoot原理/bean管理_xml_17

//@Import({TokenParser.class}) // 导入普通类,交给IOC容器管理
//@Import({HeaderConfig.class}) // 导入配置类,交给IOC容器管理
@Import({MyImportSelector.class}) // 导入ImportSelector接口实现类

案例:自定义starter

按照自己的需求,添加第三方文件,实现自定义启动

SpringBoot原理/bean管理_System_18

SpringBoot原理/bean管理_xml_19