SpringBoot配置优先级
命令行参数优先级高于Java系统属性。
Bean管理
获取Bean
@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的作用域
@Scope("prototype")//作用域,默认是singleton,可以设置为prototype,每次请求都会创建一个新的实例
@Lazy//懒加载,默认是false,设置为true时,只有在第一次请求时才会创建实例
第三方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
)的实例。
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();
}
}
第一条
上面默认方法名就是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框架已经成为主流。
原因
起步依赖原理
在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. 提高开发效率
通过使用起步依赖,开发者可以更快速地搭建项目,快速引入所需要的功能,而无需逐一添加和配置所有相关的依赖。
自动配置原理(面试题)
Spring Boot的自动配置是其核心特性之一,旨在简化Spring应用的配置过程。它通过约定优于配置的原则,自动配置Spring应用所需的bean。在这里,我将详细介绍自动配置的原理。
1. 条件配置(Conditional Configuration)
自动配置依赖于一系列的条件注解,例如:
@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.properties
或application.yml
文件来覆盖自动配置的默认属性,以实现定制化。
6. 自定义自动配置
开发者也可以创建自己的自动配置,实现公司或项目特定的配置,方法是创建一个新的@Configuration
类并添加到spring.factories
文件中。
7.手动扫描
当导入不在SpringBootApplication范围内的包时,使用手动扫描来配置。
@ComponentScan
注解用于指定Spring应该扫描的包,以查找带有@Component
、@Service
、@Repository
和@Controller
等注解的类并将其注册为bean。
@ComponentScan(basePackages = "com.example.myapp") // 指定扫描的包
//@Import({TokenParser.class}) // 导入普通类,交给IOC容器管理
//@Import({HeaderConfig.class}) // 导入配置类,交给IOC容器管理
@Import({MyImportSelector.class}) // 导入ImportSelector接口实现类
案例:自定义starter
按照自己的需求,添加第三方文件,实现自定义启动