04.SpringBoot容器功能

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 04.SpringBoot容器功能

SpringBoot容器

1.@Configuration

告诉SpringBoot这是配置文件

@Configuration(proxyBeanMethods = true)
public class MyConfig {
    @Bean//默认也是单实例的
    public User user1()
    {
        return  new User("ylc",22);
    }
}

里面包含默认值proxyBeanMethods参数

proxyBeanMethods:代理bean的方法

  • Full模式:proxyBeanMethods = true,通过方法调用依然指向原来的bean
  • Lite模式:proxyBeanMethods = false,直接返回新实例对象

组件依赖(有二次调用)必须使用Full模式默认。其他默认是否Lite模式

/*这是一个Springboot应用*/
@SpringBootApplication(scanBasePackages = "com.ylc")
public class MainApplication {
    public static void main(String[] args) {
        //返回IOC容器
       ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class,args);
        //从容器中获取组件
        User user1 = context.getBean("user1", User.class);
        User user2 = context.getBean("user1", User.class);
        System.out.println(user1==user2);
    }
}

最后为结果为true

不需要创建新组件时使用Lite模式,创建新组件时使用Full模式保证取得的组件为ioc中同一组件

2.@Import

@Import(DBHelper.class)//给容器中自动创建出这类型的组件、默认组件的名字就是全类名

3.@Condictional

条件装配:满足Conditional指定的条件才可以注入

例如@ConditionalOnBean,在有某个bean的时候才会注入

如果注入b的时候需要依赖a那么它们直接就可以使用条件装配,这个发生在bean的注入之前

如果把该注解放在类上,不满足条件整个类里面包含的东西都不会注册到,存在先后顺序

4.@ImportResource

用于导入外部资源文件

@ImportResource("classpath:beans.xml")

5.@ConfigurationProperties

用于配置文件绑定

user.name="小明"
user.age=12

5.1@Component+@ConfigurationProperties

只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能

@Component
@ConfigurationProperties(prefix = "user")//user为配置文件的前缀名
public class User {
    public  String name;
    public  int age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public User() {
    }
}
@RestController
public class HelloWorldController {
    @Autowired
    User user;
    @RequestMapping("/GetUser")
    public User GetUser()
    {
        return  user;
    }
}

5.2 @EnableConfigurationProperties+@ConfigurationProperties

@EnableConfigurationProperties(Car.class)
//1、开启Car配置绑定功能
//2、把这个Car这个组件自动注册到容器中
public class MyConfig {
}
@ConfigurationProperties(prefix = "mycar")
public class Car {
    public  String CarType;
    public  int Price;
    public Car(String carType, int price) {
        CarType = carType;
        Price = price;
    }
    public String getCarType() {
        return CarType;
    }
    public void setCarType(String carType) {
        CarType = carType;
    }
    public double getPrice() {
        return Price;
    }
    public void setPrice(int price) {
        Price = price;
    }
    public Car() {
    }
}

6.@SpringBootApplication

@SpringBootApplication是一个合成注解,实际由以下注解组成

6.1 @SpringBootConfiguration

@SpringBootConfiguration包含@Configuration注解表明这是一个配置类

6.2 @EnableAutoConfiguration(重要)

自动载入应用程序所需的所有Bean

@EnableAutoConfiguration包含以下注解

6.2.1@AutoConfigurationPackage

将指定包下的所有组件导入进来,默认MainApplication类所在的包下

里面包含@Import({Registrar.class})

利用Registrar给容器中导入一系列组件

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
        }
    }

metadata把注解源信息拿出来,然后通过getPackageNames获取包名,把包名封装到数组里面,最后注册信息

6.2.2 @Import({AutoConfigurationImportSelector.class})

给容器中导入一个组件

AutoConfigurationImportSelector类里面包含selectImports方法,String[]最后用于存储要导入的包

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    } else {
        AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
}

其中getAutoConfigurationEntry方法,获取所有自动配置的集合

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    } else {
        AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
        //获取所有候选的配置 然后将配置过滤 去重,最后再封装
        List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        configurations = this.removeDuplicates(configurations);
        Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
        this.checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = this.getConfigurationClassFilter().filter(configurations);
        this.fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
    }
}

//获取所有候选的配置

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
    return configurations;
}

其中loadFactoryNames方法,利用工厂加载得到的所有组件

public static List<String> loadFactoryNames(Class<?> factoryType, @Nullable ClassLoader classLoader) {
    ClassLoader classLoaderToUse = classLoader;
    if (classLoader == null) {
        classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
    }
    String factoryTypeName = factoryType.getName();
    return (List)loadSpringFactories(classLoaderToUse).getOrDefault(factoryTypeName, Collections.emptyList());
}

loadSpringFactories这里搜索所有META-INF/spring.factories配置文件,将根据@EnableAutoConfiguration的完整类名org.springframework.boot.autoconfigure.EnableAutoConfiguration作为查找的Key,获取对应的一组@Configuration类,存储再Map中

private static Map<String, List<String>> loadSpringFactories(ClassLoader classLoader) {
            Enumeration urls = classLoader.getResources("META-INF/spring.factories");
            }

从META-INF/spring.factories的位置来加载一个配置文件,默认扫描当前系统里面所有的信息

在spring-boot-autoconfigure-2.5.3.jar 包中的spring.factories文件中写死了SpringBoot启动要加载的所有配置

虽然所有自动配置启动的时候默认全部加载

xxxxAutoConfiguration 按照条件装配规则(@Conditional),最终会按需配置

6.3 @ComponentScan

@ComponentScan的功能其实就是自动扫描并加载符合条件的组件(比如@Component和@Repository等)或者bean定义,最终将这些bean定义加载到IoC容器中

相关文章
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
341 2
|
7月前
|
XML 前端开发 Java
SpringBoot实现文件上传下载功能
本文介绍了如何使用SpringBoot实现文件上传与下载功能,涵盖配置和代码实现。包括Maven依赖配置(如`spring-boot-starter-web`和`spring-boot-starter-thymeleaf`)、前端HTML页面设计、WebConfig路径映射配置、YAML文件路径设置,以及核心的文件上传(通过`MultipartFile`处理)和下载(利用`ResponseEntity`返回文件流)功能的Java代码实现。文章由Colorful_WP撰写,内容详实,适合开发者学习参考。
744 0
|
4月前
|
缓存 前端开发 Java
SpringBoot 实现动态菜单功能完整指南
本文介绍了一个动态菜单系统的实现方案,涵盖数据库设计、SpringBoot后端实现、Vue前端展示及权限控制等内容,适用于中后台系统的权限管理。
412 1
|
6月前
|
安全 Java API
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
|
5月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
910 0
|
7月前
|
SQL 前端开发 Java
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
481 4
|
7月前
|
存储 Java 定位技术
SpringBoot整合高德地图完成天气预报功能
本文介绍了如何在SpringBoot项目中整合高德地图API实现天气预报功能。从创建SpringBoot项目、配置依赖和申请高德地图API开始,详细讲解了实体类设计、服务层实现(调用高德地图API获取实时与预报天气数据)、控制器层接口开发以及定时任务的设置。通过示例代码,展示了如何获取并处理天气数据,最终提供实时天气与未来几天天气预报的接口。文章还提供了测试方法及运行步骤,帮助开发者快速上手并扩展功能。
|
12月前
|
安全 网络安全 数据安全/隐私保护
利用Docker的网络安全功能来保护容器化应用
通过综合运用这些 Docker 网络安全功能和策略,可以有效地保护容器化应用,降低安全风险,确保应用在安全的环境中运行。同时,随着安全威胁的不断变化,还需要持续关注和研究新的网络安全技术和方法,不断完善和强化网络安全保护措施,以适应日益复杂的安全挑战。
364 61
|
3月前
|
Kubernetes Docker Python
Docker 与 Kubernetes 容器化部署核心技术及企业级应用实践全方案解析
本文详解Docker与Kubernetes容器化技术,涵盖概念原理、环境搭建、镜像构建、应用部署及监控扩展,助你掌握企业级容器化方案,提升应用开发与运维效率。
768 108