一、SpringBoot配置文件加载的优先级
- 命令行参数具有最高的优先级,可以在应用启动时覆盖其他配置,--server.port=8080
- Java系统属性:程序内部通过System.setProperty()方法设置。
- 应用外部的带Profile的配置文件:(其中{profile}是激活的Profile名称),它们会在对应的Profile被激活时加载。
- 应用外部的不带Profile的配置文件
- 应用内部的带Profile的配置文件
- 应用内部的不带Profile的配置文件
- @Configuration注解类上的@PropertySource
- Spring Boot的特定加载顺序,bootstrap,application.yml
- 文件类型:在同一路径下,.properties文件的优先级高于.yml或.yaml文件。
二、SpringBoot的启动流程大概是什么?
先会执行main中的run()方法,run方法中会有类似于spring的IOC初始化的操作,而IOC实际上就是利用了典型的模板方法模式,实际上调用了刷新的13个模板方法,而springboot在初始化的过程中,很明显,不会进行配置文件的初始化,而是注解初始化,此时会将当前java配置类的类对象传递进去,然后接下来就是使用自动装配的注解,这个注解会去加载spring.factories文件中的内容去进行候选,同时会通过spring-autoconfiguration-metadata.properties去进行筛选,剩下的会在返回的时候加入IOC容器中
三、怎么在SpringBoot启动后执行方法?
1、使用@PostConstruct注解
@Component
public class MyStartupRunner {
@PostConstruct
public void init() {
// 在这里执行你的初始化代码
System.out.println("使用@PostConstruct注解执行初始化");
}
}
2、实现CommandLineRunner或ApplicationRunner接口
四、Spring怎么装载自定义的Bean?
- 使用XML配置文件:在XML文件中定义Bean,然后在Spring Boot的主类中通过@ImportResource注解引入这些XML配置。
- 使用Java配置类:在Spring Boot中,更推荐使用Java配置类来定义Bean。你可以创建一个带有@Configuration注解的类,并在其中使用@Bean注解来定义Bean。
- 使用组件扫描:Spring Boot的默认行为是开启组件扫描的,它会扫描@SpringBootApplication注解所在的包及其子包下的类,并自动注册带有@Component、@Service、@Repository、@Controller等注解的类为Bean
五、Spring怎么控制Bean对象要不要加载?
1、使用@Conditional注解
使用@ConditionalOnClass来检查类路径下是否存在某个类,如果存在则加载Bean;
使用@ConditionalOnMissingBean来检查容器中是否已存在某个Bean,如果不存在则加载Bean
使用@ConditionalOnProperty来根据配置属性决定是否加载Bean
2、ImportSelector接口
通过@Import注解引入一个选择器类,该选择器类可以实现根据特定条件来动态地选择一组Bean类名进行加载。这种方式在需要根据不同条件加载不同Bean集合时非常有用
3、Profile
@Profile注解本身不直接用于条件控制Bean的加载,但它允许开发者根据不同的环境(如开发、测试、生产)来激活或禁用一组Bean
六、Spring中FactoryBean和BeanFactory有什么关系?
beanFactory 是所有 spring bean容器的顶级接口,为spring的容器定义了一套规范,并提供了像getbean这样的方法 从容器中获取指定的bean实例
beanFactory在产生bean的同时,还提供了DI,用来解决bean之间依赖注入的能力
FactroyBean 是一个工厂bean,是一个接口,动态去生成某一类型的bean的实例,可以自定义一个bean 去加载到IOC容器里面
七、Spring中注入ApplicationContext能干什么?
-
获取Bean:虽然直接注入所需的Bean是更常见的做法,但在某些情况下,你可能需要在运行时根据条件或配置动态地获取Bean。
ApplicationContext
允许你通过getBean(String name)
或getBean(Class<T> requiredType)
方法获取Bean实例。 -
访问环境信息和配置文件:
ApplicationContext
提供了对Spring环境(Environment
)的访问,这使得你可以读取外部化配置(如属性文件、YAML文件或环境变量)中的值。这对于配置驱动的应用程序特别有用,因为它允许你根据环境(开发、测试、生产)或特定条件动态地调整应用程序的行为。 -
发布和监听事件:
ApplicationContext
实现了ApplicationEventPublisher
接口,允许你发布应用程序事件。这对于跨组件通信非常有用,特别是当你不希望组件之间有直接依赖时。同时,你可以通过实现ApplicationListener
接口来监听这些事件,从而在事件发生时执行特定的逻辑。 -
加载资源:
ApplicationContext
提供了对资源的访问,如文件、类路径资源等。这对于加载配置文件、图片或其他类型的资源特别有用。 -
支持AOP(面向切面编程):虽然AOP不是直接通过
ApplicationContext
实现的,但ApplicationContext
是Spring AOP集成的基础。通过ApplicationContext
,你可以轻松地注册和使用AOP切面,以实现对横切关注点(如日志、事务管理等)的模块化。 -
获取国际化消息:
ApplicationContext
支持国际化,允许你根据用户的语言偏好返回不同语言的消息。这对于开发多语言应用程序非常有用。 -
集成Spring的其他模块:Spring提供了许多扩展模块,如Spring MVC、Spring Security等,它们都与
ApplicationContext
紧密集成。通过ApplicationContext
,你可以轻松地集成这些模块,并利用它们提供的功能。