Spring多项目bean冲突及properites读取验证

Spring多项目bean冲突及properites读取验证,第1张

目前都配置了相同的bean,期望是以后能配置5个不同的数据源

可以看到bean被覆盖了4次,只有一个bean生效

所有该类型的bean在声明时候被声明为primary

发生异常,可以看到不同id的bean由于都被设置成primary导致异常

很容易理解,primary对于不同ID相同的Class实例来说只能有一个,对于相同的ID实例则会直接覆盖

正常启动,可以看到创建了两个相同类型的实例

可以看到发生覆盖情况,因此可以总结出

bean是否发生覆盖只跟beanId有关而跟bean的类型无关

当两个相同的类型的bean都被配置成primary时会发生异常

当需要配置多数据源时,需要为每个子系统的bean配置不同的ID,以防发生覆盖

下面再接着说一下Springboot对properties文件的读取

我们知道在使用springboot的脚手架建立项目时默认会有applicationproperties的配置文件

Springboot读取properties文件的读取顺序如下所示

其中需要注意的是Springboot对于同文件名只读取一次,高优先级覆盖低优先级

以上是错误的解读,实际上SpringBoot是对相同的属性以先读取的为主,文件仍然会读取多次

如果上面的图容易产生混乱的话看下面的顺序就好理解了

通俗的说SpringBoot默认只加载application-{profile}properites

当没有指定Profile时会默认加载applicationproperties文件

而当指定了SpringBoot的Profile时则会默认加载application-{profile}properties文件

当然也可以让SpringBoot除了加载默认文件以外也可以人为指定加载额外的properties文件

在我们的项目中则是通过这种方式进行

这样SpringBoot会去同时检索application-{profile}和application文件

检索顺序如上面的图所示

接下面我们进行验证

配置两个bean

第一个bean

这里的属性通过主项目的application-devproperties文件进行注入

第二个bean

属性通过子项目的applicationproperties文件进行注入

子项目目录结构

可以看出并没有符合规范结构

我们让主项目引用子项目的jar包

运行结果

启动报错,没有读取成功

接下来我们修改子项目的结构

可以看到现在已经符合规范结构,重新打包编译再进行验证

正常启动,说明此时属性注入正常,applicationproperties被成功读取

然后我们修改applicationproperties文件名为application-dev

预期结果会出现覆盖现象

正常启动,打脸了,翻阅资料发现

文件的读取是多次的,对相同的属性值来说以先读取的为标准,但是不同的属性依然可以正常读取

通过验证发现,想要在子项目配置多个子项目的情况下每个项目想引用不同的数据源首先需要保证

1每个子项目必须配置不同ID的bean,否则出现覆盖现象,需要注意的是各个子系统中的sqlSessionFactiory所指定的mapperxml路径不要出现重复,否则会造成一条SQL被多个bean命中切面

2子系统所指定的properties文件中与主系统properties文件名相同时,若出现相同属性,以先读取的为主

3除非特殊设置读取路径,否则需要按照规范放在指定路径下容器才能读取properties文件

在本文中,我们将详细介绍从BeanFactory中获取bean的多种方式。

简单地说,正如方法的名称所表达的, getBean() 负责从Spring IOC容器中获取bean实例。

首先,让我们定义一些用于测试的Spring bean。创建spring IOC容器有多种方式,但是在本文中,我们将使用基于注释的Java配置:

我们创建了两个bean。 Lion 具有默认的单例作用域。Tiger被显式地设置为 prototype 。另外,我们为每个bean定义了名称,这些名称将在后边的实例中使用。

BeanFactory提供了getBean()方法的5个方法,我们将在下面的小节中研究。

让我们看看如何使用名称获取 Lion Bean实例:

在此方法中,我们根据bean名称获取bean,如果在spring ico容器中存在和bean,则返回 Object 类的实例。否则,抛出如下异常NoSuchBeanDefinitionException。

主要的缺点是,在获取bean之后,我们必须将它转换为所需的类型。如果返回的bean的类型与我们期望的不同,则可能会产生异常。

假设我们试图用“tiger”这个名字来得到“lion”。当我们将结果转换为lion时,它会抛出一个ClassCastException:

在这里,我们需要指定所请求bean的名称和类型:

与31的方法相比,此方法更安全,因为我们可以编译阶段就发现错误而不是在运行阶段。

使用 getBean() 的第三种方式, 仅指定bean类型就足够了

在这种情况下,我们需要 特别注意可能存在的歧义

在上面的示例中,由于 Lion 和 Tiger都 实现了 Animal 接口,因此仅指定类型不足以明确确定结果。因此,我们得到一个 NoUniqueBeanDefinitionException 。即在同一个IOC 容器中,如果有相同类型的多个bean,则不能通过类型获取bean。

除了bean名称,我们还可以传递构造函数参数:

这个方法有点不同,因为它只适用于具有原型作用域的bean。

在单例的情况下,我们将得到BeanDefinitionStoreException异常。

因为原型bean,每次从spring ioc容器中获取bean都会返回一个新创建的实例,所以我们可以在调用getBean()时动态地提供构造函数参数:

正如我们所看到的,根据我们在请求bean时指定的第二个参数,每个Tiger都有不同的名称。

此方法类似于上一个方法,但是我们需要将类型而不是名称作为第一个参数传递:

与34相似, 此方法仅适用于具有原型作用域的bean

getBean()尽管是在BeanFactory接口中定义的,但是getBean()方法大部分是通过ApplicationContext访问。通常,我们在应用程序中不希望直接使用getBean()方法。

Bean应该由容器管理。如果我们想使用它们中的一个,我们应该依赖依赖注入,而不是直接调用ApplicationContextgetBean()。这样,我们就可以避免将应用程序逻辑与与框架相关的细节混合在一起。

在本快速教程中,我们从 BeanFactory 接口浏览了 getBean() 方法的所有实现,并描述了每种方法的优缺点。

1、避免Bean对象循环引用,在代码中尽量不使用applicationContextgetBean方法获取Bean对象,而是使用Spring注解进行自动装配。

2、使用了applicationContextgetBean方法获取Bean对象,则需要手动释放Bean对象,在Task执行完毕后,调试ApplicationContextgetAutowireCapableBeanFactory()destroyBean方法来销毁Bean对象。

3、在Bean中进行关闭 *** 作,比如使用了Jedis连接池等,需要在应用程序关闭前释放资源。

4、通过监控系统,定时检查运行中的实例是否有内存泄漏,及时发现并处理问题。

spring bean 自动注入只会发生在spring 管理的bean上,而你的beanJunit就不是spring 管理的bean,怎么可能会注入;

为什么下面能获取,是因你手动加载了配置文件,获取了spring 的上下文,从上下文中获取了spring 管理的bean,当然能获取到了。

spring的bean命名空间中,除了spring内部的bean,还有 自己定义的bean 。有时候,我们需要确定自己定义的bean 哪些生效 了。

使用spring的 applicationContextgetBeanDefinitionNames() ,来获取命名空间内所有的bean的name,然后根据bean的name获取 bean的class信息 ,根据 需要的bean的包路径 ,来 过滤 出自己需要的bean的信息。

需要的bean的信息,主要包括:bean的类路径,和bean的name。

其中同一个bean的类型下,有可能有多个name。如下:

定义如下工具类,可以在 非spring命名空间内 用来获取spring命名空间:

如 在spring命名空间内 ,通过如下方式 注入ApplicationContext 即可:

输出内容如下:

如果想 获取某个类,有哪些bean的实例 ,可以通过如下方法:

返回的结果,为此java类对应的bean的name,如下:

如果,java类不存在对应的bean的实例,则返回空的字符串数组

以上就是关于Spring多项目bean冲突及properites读取验证全部的内容,包括:Spring多项目bean冲突及properites读取验证、理解Spring中的getBean()、xxl-job实例的bean没有回收等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存