当前位置: 首页 > 网络应用技术

春季系列@Value [用法,数据源,动态刷新]

时间:2023-03-08 15:42:38 网络应用技术

  访调员:您在春季使用过@Value吗?介绍它介绍

  ME:@Value可以在字段上标记,并且可以将外部配置文件中的数据放在配置文件中数据库的某些配置信息中。

  访调员:也就是说,@Value的数据来自配置文件?

  我:好吧,我们项目中最常用的是用@Value引用属性文件中的配置

  访调员:@Value数据还有其他方法吗?

  我:此时,我非常高兴。我只是问所有问题。我说:当然,您可以将配置信息放入数据库或其他存储媒体中。启动容器后,您可以将此信息加载到环境中。@@@@@申请价值的价值最终被环境解析,因此您只需要扩展环境即可实现它。

  访调员:是的,似乎您仍然可以学习春天。您喜欢研究春季源代码吗?

  我:我笑着说,嗯,我真的很想在有时间的时候做一个技巧,我觉得我可以理解春天。

  访调员:看着我并微笑着,@Value注入的价值是否可以动态刷新?

  我:应该没关系,我记得Springboot中有一个@refreshscope注释来实现您说的功能

  访调员:您能告诉我@refreshscope如何实现吗?你能介绍吗?

  我:um.sensensessencei已经看过一点,但我不明白

  访调员:没关系,您可以回去再学习。您期望多少工资?

  我:30,000

  采访者:今天的采访还可以,但是如果@refreshscope可以回答,那会更好。这是一个额外的观点,但这确实很困难。

  我:(默默地想到我的心:25,000,也就是说,一个问题尚未得到回答,我削减了5,000,有点残酷,我想回去学习和学习,30,000个绝对没有问题),我说:最低的29,000 29,000

  访调员:谢谢,这里的采访在这里,向右转,不要发送!

  我有一个好习惯。从采访中返回后,我将重新提供。我必须找到一种方法来解决我没有解决的问题。

  让我们一个一个人组织他们,并找到这些问题,以帮助每个人在流行病期间通过水平并获得高薪。

  该系统需要连接到数据库,并且有许多连接DB的配置信息。

  需要在系统中发送电子邮件,并且需要配置电子邮件信息。

  还有其他一些配置信息。

  我们可以在配置文件中统一这些配置信息,并在启动时通过操作和维护对其进行修改。

  因此,如何在系统中使用这些配置信息,Spring提供@Value注释来解决此问题。

  通常,我们将配置信息存储在form =值中的属性配置文件中。

  指定的密钥通过@Value(“ $ {配置文件”)对应于指定的密钥。

  步骤1:使用@propertysource注释介绍配置文件以将@propertysource放在类上,如下

  @propertysource注释具有带有字符串数组类型的值属性,可用于指定多个配置文件的路径。

  喜欢:

  步骤2:使用@Value注释的值来引用配置文件。

  语法

  喜欢:

  如果密码不存在,那么123是值得的

  如果以上不存在密码,则值为$ {passwass}

  如果配置文件如下

  使用方式如下:

  让我们看下面的案例

  配置文件db.properties的情况

  参加配置类,在上面的配置文件中使用@propertysource介绍

  来这里,使用@Value使用配置文件中的信息

  上面的重点是注释@Value注释,请注意@Value注释

  让我们服用测试案例

  运行输出

  上面使用相对简单。许多用它来了解它的人。这也是第一个问题。大多数人还可以。让我们看@Value中的数据源方法。除了配置文件的方法外,还有其他方法可以使用其他方法。

  在正常情况下,我们的@Value数据来自配置文件,但是我们也可以使用其他方式,例如我们可以将配置文件的内容放在数据库上,这更容易修改。

  我们需要了解@Value中的数据来自春季。

  春天有一堂课

  它可以理解为配置的来源,其中包含键 - >值的配置信息。您可以根据此类提供的方法获得相应的价值信息

  内部有一种方法:

  通过名称获取相应的配置信息。

  该系统具有更重要的界面

  用于表示环境配置信息,该接口有几种方法更重要

  解决方案持有人用于分析,@值注释最终调用此方法来分析它。

  getPropertysources返回MutablePropertysources对象查看此类

  内部包含一个列表。

  弹簧容器中将有一个对象,最后将使用此对象的方法来分析@Value。

  您可以查看@Value的过程:

  通过上述过程,如果我们要更改@Value数据的来源,我们只需要将配置信息包装为PropertySource对象,然后将其扔入环境中的Mutable Propopertysources中。

  让我们遵循这个想法。

  来邮件配置信息类,内部使用@Value注入电子邮件配置信息

  让我们有另一堂课来模拟DB中的电子邮件配置信息并将其存储在地图中

  参加春季配置课

  以下是关键代码

  评论更详细,不会详细解释。

  直接运行以查看效果

  你觉得很酷吗?目前,您可以在此时进行修改。具体数据来自数据库。当您来自Redis或其他媒体时,让每个人都玩。

  上述点是以下代码。每个人都需要了解

  让我们继续看到下一个问题

  如果将配置信息放入数据库中,我们可以通过接口修改这些配置信息,然后保存。我希望该系统将立即生效,而无需重新启动。

  @Value动态刷新的问题,在Springboot中使用@refreshscope。

  这首先需要一个知识点,而不是太多,所以很多人对此并不了解,但是一个非常重要的点,让我们看看。

  这个知识点是,对于那些不知道这一点的人,首先要看这篇文章:Bean的详细说明

  豆动作域中没有位置。让我们看一下@Scope的源代码。有一个参数:

  该参数的值是scopeedproxymode的枚举,值低于4

  在前三个中,不要谈论它,只是谈论最后一个值在做什么。

  当@scope中的接头是target_class时,当前创建的bean通过CGLIB生成代理对象,并且通过此代理对象访问了目标bean对象。

  理解,让我们看一下代码,易于理解并进入自定义示波器案例更加晦涩。

  自定义豆类动作范围的注释

  @1:使用@Scope注释。值以常数为参考,值是我的,您稍后可以看到它。

  @2:注意这个地方,参数名称也为proxymode,类型也为scopeedproxymode,并且在@scope Annotation中有相同类型的参数。对范围的Proxymode参数在范围上注释,因此我们在此处设置了proxymode值。最终效果是直接在 @scope中直接更改Protxymode参数的值。此处的默认值是ScopeedProxymode.target_class

  @MysCope对相应的范围实现进行了评论如下

  @1:定义一个常数,为范围的值

  @2:此获取方法是关键。自定义范围将自动调用此获取方法来创建BEAN对象。这个地方有输出一条日志以促进效果一段时间

  @3:objectFactory.getObject()获取bean实例。

  让我们在下面创建一个类。

  @1:使用自定义范围@myscope

  @2:输出构造函数中的日志行

  @3:为用户名分配一个值,一个由UUID随机生成的

  让我们有一个弹簧配置类,加载由@compontent标记的组件

  重点在这里,测试用例

  @1:将自定义范围注册到弹簧容器

  @2:获取与设施中用户相对应的bean

  @3:输出与此豆相对应的类

  在代码之后,进行了三次周期,调用用户的getUsername方法,以及该方法之前和之后的日志输出行。

  是时候见证奇迹,运行输出了

  从输出的前两行可以看出:

  可以看出,可以看到随后的日志输出,每次user.getUsername方法都调用,beanmyscope#get方法和用户构造函数自动在内部调用。

  可以从上述情况下可以看出,当protacyMode = scopeedproxymode.target_classs中的定制范围中的target_class将为此bean创建一个代理对象,任何调用代理对象的方法都会调用实心范围的自定义范围(上面(上面)(上面的abovethe在beanmyscope中获取方法)再次获取此bean对象。

  然后,我们可以使用上面解释的功能来实现@Value的动态更新,从而实现自定义范围。此自定义范围支持@Value nihihihitation自动刷新。此自定义注释(修改配置)调用这些BEAN的任何方法,让Spring重新启动此BEAN的初始化,可以实现此想法,让我们写下下面的代码。

  首先定义一个范围:刷新Scope

  需要@refreshscope注意的类以支持动态刷新@Value配置

  @1:这个地方是一个钥匙,使用scopeedproxymode.target_class

  此定制范围对应分析类别以下类在以下类中删除,可以忽略

  以上获取方法将首先从BeanMap获得。如果您无法获得它,您将调用objectFactory的getObject以创建bean的实例,然后将其扔到beanmap

  上面的干净方法用于清理所有当前缓存的beanmap

  让我们有一个电子邮件配置类,并向配置注入@Value注释。

  @1:使用自定义范围@refreshscope

  @2:将@value的一个值注入mail.username

  倒入to绳方法,该方法可以在测试时看到效果。

  让我们有一个普通的豆子,在内部将注入MailConfig

  代码相对简单,重写了ToString方法,可以在测试时看到效果。

  上课以获取DB的电子邮件配置信息

  参加春季配置类,扫描上面的组件

  工具类内有2种方法,如下:

  模拟了UpdatedBConfig方法以修改调用方法时的配置在DB中,该方法中的2行方法是第一行代码调用refreshmailpropertysource方法,以修改容器中邮件的配置信息

  beanrefreshscope.getInstance()。Clean()用于删除BeanRefreshscope中的所有缓存豆。然后,当您调用任何方法时,您将重新启动弹簧容器以创建bean。弹簧容器将重新分析 @值信息,此时,容器中的邮件配置信息是新的,因此@Value注入的信息也是新的。

  让我们服用测试案例

  @1:周期3次,输出有关MILSERVICE的信息

  @2:周期3次,首先使用@3来模拟DB中的配置信息,然后输出邮件服务信息

  见证奇迹时刻,看看效果

  上述邮件服务已输出6次。前三个用户名的值相同。后续用户名的值不同,表明修改配置已经有效。

  Dynamic @Value实现的关键是@Scope中的Prodxymode参数。该值是scopeedproxymode.default,它将生成一个代理以通过此代理实现@Value Dynamic Refresh的效果。这个地方是关键。

  如果您有兴趣,可以在Springboot中查看@refreshscope注释源代码,类似于我们上方的@refreshscope,这与原理类似。