返回顶部
首页 > 资讯 > 后端开发 > Python >springboot如何读取自定义properties并注入到bean中
  • 778
分享到

springboot如何读取自定义properties并注入到bean中

2024-04-02 19:04:59 778人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录读取自定义properties注入到beanSpringBoot启动日志如下springboot bean实例化和属性注入过程springboot版本(2.0.4 RELEASE

读取自定义properties注入到bean

在使用springboot项目时,可使用@value的方式直接读取application.properties中的文件,但有时我们需要配置自定义的properties,下面方法将在springboot启动时利用fileinputstream读取properties文件中的内容,并注入到bean中,@Configuration注解会在springboot启动时执行一次,代码如下:


package com.shanqis.parking.properties; 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
 

@Configuration
public class PropertiesClassLoader { 
    private Logger logger = LoggerFactory.getLogger(PropertiesClassLoader.class); 
    private Map<String, Object> versionProperties = new HashMap<>(16); 
    private void init(String name) { 
        try {
            Properties properties = new Properties(); 
            InputStream in = PropertiesClassLoader.class.getClassLoader().getResourceAsStream(name + ".properties"); 
            properties.load(in); 
            logger.info("加载{}.properties参数", name); 
            for (String keyName : properties.stringPropertyNames()) {
                String value = properties.getProperty(keyName); 
                if ("version".equals(name)) {
                    versionProperties.put(keyName, value);
                } 
                logger.info("{}.properties---------key:{},value:{}", name, keyName, value);
            }
            logger.info("{}.properties参数加载完毕", name);
        } catch (IOException ignored) { 
        } 
    }
 
    @Bean(name = "versionProperties")
    public Map<String, Object> commonMap() {
        init("version");
        return versionProperties;
    }
}

springboot启动日志如下

然后在controller层或者service层等可以这样使用



	@Autowired @Qualifier("commonMap")
	protected Map<String, String> commonMap;

springboot bean实例化和属性注入过程

springboot版本(2.0.4 RELEASE)

大致描述springboot中bean的实例化和属性注入过程流程

1) 在某一时刻Spring调用了Bean工厂的getBean(beanName)方法。beanName可能是simpleController,或者simpleService,simpleDao,顺序没关系(因为后面会有依赖关系的处理)。我们假设simpleController吧

2)getBean方法首先会调用Bean工厂中定义的getSingleton(beanName)方法,来判断是否存在该名字的bean单例,如果存在则返回,方法调用结束(spring默认是单例,这样可以提高效率)

3) 否则,Spring会检查是否存在父工厂,如果有则返回,方法调用结束

4) 否则,Spring会检查bean定义(BeanDefinition实例,用来描述Bean结果,component-scan扫描后,就是将beanDefinition实例放入Bean工厂,此时还没有被实例化)是否有依赖关系,如果有,执行1)步,获取依赖的bean实例

5) 否则,Spring会尝试创建这个bean实例,创建实例前,Spring会检查调用的构造器,并实例化该Bean,(通过Constructor.newInstance(args)进行实例化)

6) 实例化完成后,Spring会调用Bean工厂的populateBean方法来填充bean实例的属性,也就是自动装配。populateBean方法便是调用了BeanPostProcessor实例来完成属性元素的自动装配工作

7)在元素装配过程中,Spring会检查被装配的属性是否存在自动装配的其他属性,然后递归调用getBean方法,知道所有@Autowired的元素都被装配完成。如在装配simpleController中的simpleService属性时,发现SimpleServiceImpl实例中存在@Autowired属性simpleDao,然后调用getBean(simpleDao)方法,同样会执行1)----7)整个过程。所有可以看成一个递归过程。

8)装配完成后,Bean工厂会将所有的bean实例都添加到工厂中来。

Bean的实例化

1. 进入SpringApplication类中refreshContext()方法

2. 进入AbstractApplicationContext类中refresh()方法,找到this.finishBeanFactoryInitialization()方法,这个方法就是完成beanFactory的实例化

3. 进入AbstractApplicationContext类中finishBeanFactoryInitialization()方法,找到preInstantiateSingletons()

4. 进入DefaultListableBeanFactory类中preInstantiateSingletons()方法,找到getBean()方法

5. 进入AbstractBeanFactory类中getBean()方法,找到doGetBean()方法

6. 在AbstractBeanFactory类中doGetBean方法中,找到createBean()方法

7. 进入AbstractAutowireCapableBeanFactory类中createBean方法中,找到doCreateBean()方法

8. 在AbstractAutowireCapableBeanFactory类中doCreateBean()方法中,找到createBeanInstance()方法,看名字就知道是实例化bean的

9. 在AbstractAutowireCapableBeanFactory类createBeanInstance()方法中,找到instantiateBean()方法

10. 在AbstractAutowireCapableBeanFactory类instantiateBean()方法中,找到instantiate()方法

11. 在SimpleInstantiationStrategy类instantiate()方法中,找到instantiateClass()方法

12. 在BeanUtils类instantiateClass()方法中,可知bean的实例化是通过Constructor.newInstance()进行实例化

Bean的属性注入

1. 在AbstractAutowireCapableBeanFactory类doCreateBean()方法中,找到populateBean()方法,从名字可知是用来填充bean的

2. 在AbstractAutowireCapableBeanFactory类中populateBean()方法,找到postProcessPropertyValues()方法

3. 进入AutowiredAnnotationBeanPostProcessor类中postProcessPropertyValues()方法中,找到findAutowiringMetadata()方法,在这个方法中,如果属性中含有@Autowired注解则会递归getBean()。没有然后进入inject()方法中

4. 进入AutowiredAnnotationBeanPostProcessor类inject方法中,找到resolveDependency()方法,通过这个方法获取对应字段的值

5. 进入AutowiredAnnotationBeanPostProcessor类inject方法中,找到field.set(bean, value)方法,通过反射将值设置到属性中

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: springboot如何读取自定义properties并注入到bean中

本文链接: https://lsjlt.com/news/158693.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • springboot如何读取自定义properties并注入到bean中
    目录读取自定义properties注入到beanspringboot启动日志如下springboot bean实例化和属性注入过程springboot版本(2.0.4 RELEASE...
    99+
    2024-04-02
  • 在SpringBoot下如何读取自定义properties配置文件
    这篇文章将为大家详细讲解有关在SpringBoot下如何读取自定义properties配置文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。SpringBoot工程默认读取application.prop...
    99+
    2023-05-30
    spring boot properties
  • SpringBoot读取自定义配置文件方式(properties,yaml)
    目录一、读取系统配置文件application.yaml二、读取自定义配置文件properties格式内容三、读取自定义配置文件yaml格式内容四、其他扩展内容一、读取系统配置文件a...
    99+
    2024-04-02
  • SpringBoot如何自定义bean绑定
    本篇内容介绍了“SpringBoot如何自定义bean绑定”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!自定义bean绑定在配置文件中写入s...
    99+
    2023-07-04
  • springboot如何读取自定义属性
    很多时候,我们开发当中,需要通过配置自己的属性信息来满足不同环境下的应用部署,因此需要springboot能够读取我们自定义的属性,常用的读取自定义属性有@Value和@Config...
    99+
    2024-04-02
  • Springboot如何通过自定义工具类获取bean
    目录Springboot 自定义工具类获取bean在工具类注入bean的三种方式1. 需求/目的2.使用环境3.方法一:获取ApplicationContext上下文4.方法二:将工...
    99+
    2024-04-02
  • SpringBoot中如何解决读取properties文件读取问题
    目录如何解决读取properties文件读取问题问题描述路径设置中文乱码读取指定properties文件设置配置属性类型配置文件如何解决读取properties文件读取问题 问题描述...
    99+
    2024-04-02
  • Springboot 读取自定义pro文件注入static静态变量方式
    Springboot 读取pro文件注入static静态变量 mailConfig.properties #服务器 mail.host=smtp.qq.com #端口号 mail...
    99+
    2024-04-02
  • SpringBoot项目如何将Bean注入到普通类中
    目录如何将Bean注入到普通类中Spring管理的类获得一个注入的Bean方式非Spring管理的类获得一个注入的Bean方式普通类中通过ApplicationContext上下文获...
    99+
    2024-04-02
  • Springboot 读取自定义pro文件注入static静态变量的方法
    本篇内容介绍了“Springboot 读取自定义pro文件注入static静态变量的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Spr...
    99+
    2023-06-20
  • SpringBoot如何获取application.properties中自定义的值
    目录结构: pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt...
    99+
    2024-04-02
  • Spring中如何将值注入到Bean中
    这篇文章给大家介绍Spring中如何将值注入到Bean中,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在Spring中,有三种方式注入值到 bean 属性。正常的方式快捷方式“p” 模式新建一个User类,它包含use...
    99+
    2023-05-31
    spring bean bea
  • 如何使用Springboot自定义注解并支持SPEL表达式
    这篇文章主要介绍了如何使用Springboot自定义注解并支持SPEL表达式,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Springboot自定义注解,支持SPEL表达式举...
    99+
    2023-06-29
  • springboot 如何取消starter的自动注入
    目录springboot 取消starter的自动注入看例子重点来了SpringBoot 自动注入问题配置文件如下项目目录springboot 取消starter的自动注入 star...
    99+
    2024-04-02
  • 如何读取Golang http.Request对象中的自定义ajaxParams
    php小编小新为您介绍如何读取Golang http.Request对象中的自定义ajaxParams。在Golang中,我们经常使用http包处理HTTP请求。当我们使用AJAX发送...
    99+
    2024-02-09
    golang开发
  • Springboot如何获取配置文件application.yml中自定义的变量并使用
    前言:在写项目中我们经常要将同样的变量在不同的文件中写无数次,这样修改起来要一通好找,非常不方便,平常都会写一个工具类存入自己的变量进行调用取值,但是呢,懒得写咋办,写了还要注入,注...
    99+
    2024-04-02
  • SpringBoot中如何自定义参数绑定
    这篇文章给大家介绍SpringBoot中如何自定义参数绑定,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。自定义参数转换器自定义参数转换器实现Converter接口,如下:public class D...
    99+
    2023-06-19
  • Springboot 如何指定获取自己写的配置properties文件的值
    获取yml的可以参考这篇: Springboot 指定获取出 yml文件里面的配置值 www.jb51.net/article/217901.htm 直接进入正题: 先创建一个 配置...
    99+
    2024-04-02
  • Springboot中如何自定义Banner图案
    这篇文章给大家介绍Springboot中如何自定义Banner图案,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、前言我们在启动 Spring Boot 项目时,默认会在控制台打印 Spring logo 和版本等信...
    99+
    2023-06-15
  • Hive如何自定义函数实现将自定义函数注册到hive源码中并重新编译hive
    这篇文章主要介绍Hive如何自定义函数实现将自定义函数注册到hive源码中并重新编译hive,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!hive版本:    hive-1.1.0-cdh6.7....
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作