Spring BeanDefinition 生成所有bean的配置信息

Spring BeanDefinition 生成所有bean的配置信息,第1张

这个过程会记录下所有的bean定义,这只是定义,还没生成具体的bean。

Map<String, RootBeanDefinition> mergedBeanDefinitions。

为了不至于每次用到配置信息的时候都去解析一遍配置文件,我们需要将解析结果保存起来。而保存解析结果这个过程就是BeanDefinition的注册。

顺着obtainFreshBeanFactory方法,进入到AbstractRefreshableApplicationContext的refreshBeanFactory方法,这个方法的主要功能就是创建默认的IOC容器和Xml配置文件的相关 *** 作。

执行完,bean定义信息就加载完成了,后面就根据这些定义信息生成bean。

容器启动时,先读取配置文件,如果发现配置文件里设置了扫描注解,则扫描注解生成每个bean的BeanDefinition放入BeanDefinition 容器。再继续读取xml,将配置的bean放入到BeanDefinition 容器中,这样bean定义容器就有了所有的BeanDefinition。

下一步就根据这些bean定义生成bean对象,并注入依赖的bean,如果依赖的bean没有,则继续生成,这样递归下去,知道所有的bean都生成结束。

构造一个IOC容器需要如下几个步骤:

第一步:资源的定位。所谓资源就是指Spring里众多的XML配置文件,要获取到配置文件里面的信息,首先是要找到它。

第二步:加载和解析资源文件。XML文件里面定义的一些节点,和Spring里面定义的数据结构不匹配,那么就需要按照Spring的解析规则将XML解析成Spring需要的。

第三步:将解析完的数据结构注册到IOC容器中。Spring中内部的数据结构叫BeanDefinition。

经过以上三个步骤之后,IOC容器已经构造好,但是还是不能被直接使用。BeanDefinition只是配置文件里的配置在IOC中建立的一个映射,对于IOC容器来说最重要的依赖关系都还没有注入呢,相当于光有一个壳,内容还没有填充。

这里又有个Spring中重要的概念,叫做依赖注入。依赖的意思上文中有提到过吧,就是对象的引用关系嘛,注入是个动词,个人理解为设置,那依赖注入的意思不就是设置对象的引用关系了哇。

接下来这个过程是容器的实例化。容器的实例化只有一步,就是依赖注入。

完成IOC容器的构造和实例化之后,完整的IOC就建立好了。主线分析好了,接下来便可以顺藤摸瓜的学习源码了。

依赖注入主要有两个过程,一个是实例化Bean,另一个是将依赖关系注入到Bean中。

依赖注入的入口是我们熟悉的getBean方法。

springboot中有三种方式可以获取yml配置文件中的配置内容。

yml如下

注意,使用ConfigurationProperties后可能会有如下报错:

虽不影响运行,但是很碍眼,可通过在springboot项目的pom文件中添加如下依赖解决:

分别访问三个测试接口:

常规的,在springboot中一般只需要拿appolo或者nacos里配置的属性就够了。

但是也有一些很特殊的场景,要拿到appolo或者nacos里配置的文件,比如有个第三方jar包提供的方法中,要求把properties配置文件路径传进去来初始化第三方jar包里需要用到的东西,这时候一般是把properties文件配置到appolo或者nacos里,但是如何直接拿到这个properties文件而不是里面的属性值呢?

apollo里直接提供了把配置的相应namespace直接转换成file的方法:

再把这个content转换成输入流就可以用了

如果只是想拿到里面某个namespace的属性,则可以:

key为属性key名,cgetPropertyNames()方法能拿到该namespace下面的所有属性,返回一个Set<String>集合,再遍历这个集合就能拿到所有属性。

nacos跟apollo的处理思路有点不一样,找了很多资料,貌似没有找到nacos里直接获取整个获取配置文件的方法,后面如果有同学找到了这个方法记得留言提醒我。

nacos在springboot启动的时候已经把所有配置文件都注入到了spring里。

第一种:可以直接用注解 @Value("${key}")来获取配置好的属性值

第二种:在java里获取:

新建SpringContextUtil实现orgspringframeworkcontextApplicationContextAware这个接口:

在启动类用注解导入该类:@Import({SpringContextUtilclass})

利用orgspringframeworkcoreenvEnvironment类来直接获取属性:

如果有这样一个需求,有个第三方的jar包要求初始化配置好的properties文件,只给了properties文件的路径传参,只能用文件路径的方式初始化这个第三方jar包,那么我们就必须保证项目里或者其他文件夹有这个properties文件才可以,而这些配置如果经常要变的话,最好也是配置在nacos或者apollo,如此看来,apollo是可以直接把配置的相应namespace直接转换成file,而nacos大概只能把所有属性手工生成一个新的properties文件来保存到本地了。

这个生成文件的过程,要在springboot启动之后立即执行:

那我们就要建一个配置类实现orgspringframeworkbeansfactoryInitializingBean这个接口,重写afterPropertiesSet()方法:把需要启动后执行的逻辑放在里面,下面是一个示例:

把这个类在启动类里注入:

如此,在启动的时候就可以在本地生成一个cssconfigproperties文件了。

于是乎就可以类似这样调用第三方接口(根据第三方jar包来定):

这个跟spring mvc一样的啊,首先你看你的spring-mvcxml 有没有配置defaultViewResolver, 然后你在action的方法中如果1标注了@ResponseBody,返回字符串的话是通过write输出到页面。2没有标注这个,spring mvc会到配置的目录下 找相应的jsp。

让静态资源不被SpringMVC分配器过滤有两种办法: ① 把所有的 JS 和 CSS 文件移至别 文件夹需要被过滤的文件类型分别写一个 mapping第二种方法是在webxml配置静态资

使用开发工具创建一个纯净maven工程

删除配置spring-bizxml并且新增如下配置:

本文梳理了SpringBoot六种读取配置方式,大家在项目中可以进行灵活组合和应用,希望本文对大家有所帮助。

以上就是关于Spring BeanDefinition 生成所有bean的配置信息全部的内容,包括:Spring BeanDefinition 生成所有bean的配置信息、Springboot获取yml内容的三种方式、springboot中获取apollo或者nacos里的配置文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9719511.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存