配置优先级
文件属性配置
SpringBoot中支持三种格式的配置文件,优先顺序为:
注意事项:虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置(yml是主流)
SpringBoot除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置。
Java系统属性配置(以配置端口号为例)
-Dserver.port=9000
命令行参数
--server.port=10010
优先级顺序为
命令行参数 > Java系统属性 >application.properties > application.yml > application.yaml
Bean管理
获取bean
默认情况下,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)
想要从IOC取出bean对象,首先得拿到IOC容器对象
@Autowired
private ApplicationContext applicationContext;//IOC容器对象
@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);
}
注意:Spring项目启动时,会把bean都创建好还会受到作用域及延迟初始化影响,这里注意针对于 默认的单列非延迟的bena而言
bean作用域
Spring支持五种作用域,后三种在web环境才生效:
作用域 说明
singleton 容器内同名称的bean只有一个实例(单例)(默认)
prototype 每次使用该 bean 时会创建新的实例(非单例)
request 每个请求范围内会创建新的实例(web环境中,了解)
session 每个会话范围内会创建新的实例(web环境中,了解)
application 每个应用范围内会创建新的实例(web环境中,了解)
设置作用域
可以通过@Scope注解来进行配置作用域
测试类
我们还没有执行for里面的语句,此时已经调用了DeptController的构造方法并放入IOC容器里了
执行结果,因为默认情况下容器内同名称的bean只有一个实例
如何让容器在启动时被创建呢?
用@Lazy注解
想要每次使用该 bean 时会创建新的实例
注意
默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。
第三方bean
如果要管理的bean对象来自于第三方(不是自定义的),是无法用@Component及衍生注解声明bean的,就需要用到@Bean注解。
现在就可以通过注入的方式拿该bean对象了
但是不建议写在启动类里面
若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。
如果没有指定第三方bean名称,默认是方法名
注意
通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
如果第三方bean需要其它bean依赖,直接在bean定义方法中设置形参即可,容器会根据类型自动装配
@component及衍生注解与@Bean注解使用场景?
项目中自定义的,使用@Component及其衍生注解
项目中引入第三方的,使用@Bean注解