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 实现自动化配置的核心注解

最终所配置自动装配全限定类型的文件:

posted @ 2023-08-28 21:55  chuangzhou  阅读(8)  评论(0编辑  收藏  举报