
配置优先级:
SpringBoot中支持三种格式的配置文件:
application.properties-----application.yml------application.yaml
如果三个都配置同一属性端口了,到底哪个配置文件生效?
经过验证:application.properties>application.yml>application.yaml
注息事项: 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置(yml是主流
SpringBoot除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置。


将这五种配置方式比较,优先级最高的是命令行参数,其次是java系统属性,之后依次排列。
命令行参数>java系统属性>application.properties>application.yml>application.yaml
@Component, @Service, @Bean等
Q:Bean和普通对象有什么区别? A:普通对象自己new,自己管理;Bean由Spring容器管理,支持依赖注入、AOP、事务等。
Q:@Component和@Bean有什么区别? A:
@Component:用在类上,Spring自动扫描创建
@Bean:用在方法上,手动定义创建逻辑,通常用于第三方库的类
Q:Bean默认是单例,线程安全吗? A:不!如果Bean有状态(成员变量),需要考虑线程安全。无状态Bean是线程安全的。
Q:如何解决Bean的循环依赖? A:
简单说:Bean让你从"对象装配工"变成"业务架构师"。
就像你开车时:
这就是IOC(控制反转)的核心思想:
所以虽然业务逻辑是你写的,但所有"基础设施"的工作都交给Spring了,让你能更专注于业务本身
Bean封装的是特定领域的完整能力——不仅仅是数据,而是数据 + 行为 + 状态 + 配置 + 依赖的完整组合。
就像一辆汽车:
就像电影制作:
导演设计了剧情(你写了业务方法),但电影的拍摄和放映是由制片公司系统化完成的!
所以,业务逻辑是你写的,但调用这个逻辑的系统是Spring提供的。这就是框架的意义所在!
所以,Bean = 高内聚的功能单元,它把相关的数据和行为打包在一起,对外提供清晰的服务接口,内部隐藏实现细节。这就是面向对象和IoC容器的完美结合!
默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式: 根据name获取bean:Object getBean (String name) 根据类型获取bean:(<T> T getBean (Class<T> requiredType) 根据name获取bean(带类型转换):<T> T getBean (String name, Class<T> requiredType)
注意事项 上述所说的[Spring项目启动时,会把其中的bean都创建好】还会受到作用域及延迟初始化影响,这里主要针对于默认的单例非延迟加载的bean而言。
Spring支持五种作用域,后三种在web环境才生效:


@Bean 如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component 及衍生注解声明bean的,就需要用到@Bean注解

这是配置在启动类中的,一般不建议,因为我们要保证启动类的纯粹性,这是我们可以创建一个类加上@Configuration配置类。

注意事项 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
项目中自定义的,使用@Component及其衍生注解 项目中引入第三方的,使用@Bean注解。
起步依赖原理:maven的依赖传递。
自动配置原理:SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
SpringBoot只能扫描启动类所在包及其子包,当我们引入第三方bean时,并不在启动类所在包或子包。这时,我们
方案一:@ComponentScan组件扫描:需要注意的,添加了这个注解,会覆盖原来的包,我们也需要加上原来的包。
使用繁琐,性能低。
方案二:@lmport导入。使用@lmport导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:
导入普通类 导入 配置类 导入ImportSelector接口实现类
@EnableXxxx注解,封装@Import注解

该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。该注解由三个部分组成:
@SpringBootConfiguration:该注解与@Configuration注解作用相同,用来声明当前也是一个配置类。 @ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。 @EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。
作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到SpringIOC容器中。 位置:方法、类 @Conditional本身是一个父注解,派生出大量的子注解: @ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。 @ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或名称),才注册bean到IOC容器@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。
字节码文件:JdbcTemplate.class ↓ 先决条件:有JdbcTemplate类,说明项目想用JDBC ↓ Bean对象:dataSource() 和 jdbcTemplate() ↓ 关系:字节码文件是创建Bean的前提条件
核心逻辑:
所以字节码文件和要添加的Bean对象有关系,但不一定是1:1的对应关系,而是功能模块的对应关系!