SpringBoot - (二)
配置文件优先级
虽然springboot 支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置(yml是主流)
IDEA 配置 系统属性和 命令行参数:
命令行参数 > 系统属性
总体优先级:
命令行参数优先级 > 系统属性 > application.properties > application.yml > application.yaml
Bean 管理
package com.chuangzhou;
import com.chuangzhou.controller.DeptController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
@SpringBootTest
class BliasWebManagerApplicationTests {
@Autowired
private ApplicationContext applicationContext;
@Test
public void testGetBean(){
//1. 根据对象的名称获取bean对象
DeptController deptController = (DeptController) applicationContext.getBean("deptController");
System.out.println(deptController);
//2. 根据类型获取bean对象
DeptController bean = applicationContext.getBean(DeptController.class);
System.out.println(bean);
//3. 根据bean 的名称及类型获取对象
DeptController deptController1 = applicationContext.getBean("deptController", DeptController.class);
System.out.println(deptController1);
}
}
上下文获取到的对象默认为单列:
bean的作用域
可以使用@Sope 注解来配置bean对象的作用域
注意事项:
- 默认singleton 的bean,在容器启动的时候被创建,可以使用 @Lazy 注解来延迟初始化,延迟到第一次使用的时候才创建对象
- prototype 的bean,每一次使用该bean的时候都会创建一个新的实例
- 实际开发当中,绝大部分的 Bean是单例的,也就是说绝大部分Bean 不需要配置Scope属性
第三方Bean管理
引入第三方的jar包后其不在 启动类所属的包 及其 子包,也就是spring 无法识别到, 此时 jira 中的对象怎么交给spirng 容器管理?
方案一:
@ComponentScan
方案二:
@Bean 注解标记方法,方法的返回值交给IOC ,
不建议直接写在启动类中
package com.chuangzhou;
import org.dom4j.io.SAXReader;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.context.annotation.Bean;
@SpringBootApplication
@ServletComponentScan
public class BliasWebManagerApplication {
public static void main(String[] args) {
SpringApplication.run(BliasWebManagerApplication.class, args);
}
@Bean
public SAXReader reader(){
return new SAXReader(); //将方法的返回值交给spring容器管理
}
}
可以写一个配置类来进行管理:
package com.chuangzhou.config;
import com.chuangzhou.serivce.DeptService;
import org.dom4j.io.SAXReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CommConfig {
// @Bean(name = {"saxReader"})
@Bean(value = {"saxReader"})
// @Bean
public SAXReader reader(DeptService deptService){ //name 和 value 都可以指定bean的名称,如果没有指定默认使用方法名作为bean的名称
System.out.println(deptService); //方法的所需参数,spring会自动注入
return new SAXReader();
}
}
方案三:
@Import导入。使用@Import 导入的类会被Spring 加载到IOC容器,导入的形式主要有以下几种:
- 导入普通类
- 导入配置类
- 导入 ImportSelector 接口实现类
package com.example;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class MyImportSelector implements ImportSelector {
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.example.HeaderConfig"}; //实现的接口中指定配置类
}
}
测试类:
package com.chuangzhou.springbootwebbeandemo;
import com.example.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Import;
//@Import({HeaderConfig.class})
@Import({MyImportSelector.class})
//@EnableHeaderConfig
@SpringBootTest
class SpringbootWebBeanDemoApplicationTests {
@Autowired
private ApplicationContext applicationContext;
@Test
public void testGetHeaderConfig() {
Object headerParserParser = applicationContext.getBean(HeaderParser.class);
System.out.println(headerParserParser);
Object tokenParser = applicationContext.getBean(HeaderGenerator.class);
System.out.println(tokenParser);
}
}
效果:
- @EnableXxxx 注解,封装@Import 注解(推荐)
package com.example;
import org.springframework.context.annotation.Import;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Import(MyImportSelector.class)
public @interface EnableHeaderConfig {
}
注意事项:
1.一个类上只能使用一次Import 注解
2.Import后 getBean: 只能使用class来获取,通过名称获取会报错
3.被导入的类 不管 有没有被 spring Conponent注解标识到 在导入项目中都可以交给spring 容器管理
SpringBoot 原理
- 起步依赖:mavne 依赖传递
- 自动装配:当 spring 容器启动后,一些配置类、bean对象就自动存入到了IOC 容器中,不需要我们手动声明,从而简化了开发,省去了繁琐的配置操作
自动装配原理
@SpringBootApplication:
该注解标识在SpringBoot 工程引导类上,是SpringBoot 中最重要的注解。该注解由三个部分组成
- @SpringBootConfiguration:该注解与@Configuation 注解作用相同,用来声明当前也是一个配置类
- @ConponentScan: 组件扫描,默认扫描当前引导类所在包及其子包
- @EnableAutoConfiguration: SpringBoot 实现自动化配置的核心注解
最终所配置自动装配全限定类型的文件:
本文来自博客园,作者:chuangzhou,转载请注明原文链接:https://www.cnblogs.com/czzz/p/17663490.html