对于从事Java开发的小型合作伙伴,春季框架必须熟悉它。Spring为开发人员提供了非常丰富的API,以满足我们的日常工作需求。
如果要创建一个BEAN实例,则可以使用@Controller,@service,@repository,@component,等。
如果要依靠对象,则可以使用@Autowired和@Resource注释。
如果要打开交易,则可以使用@transactions。
如果要在配置文件中动态读取系统属性,则可以使用@Value注释。
等等,有很多。
以前的常用注释是在我过去的文章中引入的,我不会在这里解释。
今天,我们专注于交谈,因为这是非常有用的,但是非常容易被忽略。大多数人可能只使用了一些功能,这是一件非常令人遗憾的事情。
因此,今天有必要与您见面。
最近,我无意中获得了由大蝙蝠工厂写的刷笔笔记。我突然打开了我的第二次Ren du脉冲,我觉得该算法并不像过去那样困难。
如果在UserVice类中,您需要将系统属性注入用户名变量。通常,我们将编写以下代码:
通过指定系统属性的名称,需要包装名称。
这样,Spring将自动帮助我们将相应的系统属性值注入用户名变量。
但是,上述功能的重点是配置文件中同名的系统属性(缩写:配置文件):
那么,这个名字真的必须完全相同吗?
目前,一些朋友可能会说:在配置类中,定义的参数名称可能与配置文件中的系统属性名称不同。
例如,在配置类MyConfig类中定义的参数名称是用户名:
配置文件中配置的系统属性名称是:
它在类中使用,配置文件不同。但是在测试后,发现该函数可以正常运行。
可以使用配置文件中的系统属性名称,并且Spring可以在配置类中找到属性名称用户名进行分配。
可以看出,配置文件中的系统属性名称可能与配置类中的属性名称不同。但是,有一个前提是前缀susan.test必须相同。
那么,注释中定义的系统属性名称可以不同吗?
答案:不。如果不是相同,则在启动项目时将直接报告错误。
另外,如果系统属性名称是在@Value注释中指定的,但是未配置实际配置文件,它也将报告与上述相同的错误。
因此,@值注释中指定的系统属性名称必须与配置文件中相同。
我不知道小心的朋友是否发现我配置的属性值:实际上已经结束了。
你为什么这么做?
如果张SAN在配置文件中配置:
最终获取数据时,您会发现用户名有一个乱码的代码:
?????
什么?
为什么有乱码的代码?
答:在Springboot类中,默认编码格式是该类中系统属性的读数。如果系统属性包含汉字,则将看起来乱七八糟。
那么,如何解决乱码的问题?
目前有三个解决方案:以下三个解决方案:
显然,@Value不支持编码参数,因此不可用方案2。
如果使用方案1 1,则特定实施代码如下:
它确实可以解决乱码的问题。
但是,如果该项目包含大量中国系统属性值,则您需要每次添加如此特殊的转换代码。当有很多重复代码时,您是否会感到有些恶心?
我很恶心。
那么,如何解决代码重复问题?
答:将属性值的中文内容转换为Unicode。
与此类似:
此方法还可以在不令人作呕的代码的情况下解决乱式问题,但是您需要进行额外的转换工作,但是这种转换非常容易,因为有准备好的在线转换工具。
建议使用此工具转换:http://www.jsons.cn/unicode/
顺便说一句,告诉您一个小秘密:如果您使用或格式化配置文件,则不会有中文乱码的问题。
为什么又来了?
因为.yml或.yaml格式中的配置文件最终将使用类分析。在其方法中,首先读取BOM文件标头信息。如果HEAD信息中有UTF8,UTF16BE和UTF16LE,则使用相应的编码。采用默认编码。
应该注意的是,乱码问题通常出现在本地环境中,因为.properties配置文件直接在本地读取。,NACOS,您将遵循其他逻辑,不会出现问题。
有时,默认值是我们头痛的问题。
你为什么这样说?
因为Java的默认值通常无法满足我们的日常工作需求。
例如,有这样的要求:如果配置了系统属性,则用户名使用配置属性值。如果没有配置,则用户名使用默认值。
一些朋友可能认为他们可以做到这一点:
定义参数时直接给出一个默认值,但是如果您仔细考虑此技巧。由于用户名的默认值的时间比@Value注释依赖项更早,也就是说,用户名的默认值是初始化的,并且是初始化的默认值。它仍然会被覆盖。
那么,如何设置默认值?
答:使用。
例如:
在系统属性名称之后添加符号,该名称需要设置默认值。请立即在右侧设置默认值。
建议您在使用 @value时尽可能多地设置默认值。如果您不需要默认值,则宁愿设置一个空。例如:
你为什么这么说?
如果有这样的场景:使用useservice类包含使用层,并且业务层由API服务和作业引用。但是,在UserService类中@Value的用户名仅在API服务中有用,并且属性是有用的在工作服务中不使用。
对于工作服务,如果在.properties文件中的同名系统属性中未配置它,则在服务启动时将报告错误。
这个坑,我以前踏上了很多次。因此,建议在使用@Value注释来防止类似问题时为参数设置默认值。
我们以前已经看过,如何使用@Value注释和注入课程。
因此,如果问题出现,您可以自动注入系统属性值吗?
如果将用户名定义为:
该程序可以正常启动,但是用户名的值是null。
可以看出,修改后的变量通过@Value注入故障。
作为一个好奇的婴儿,目前,您必须问:如何将系统属性值注入静态变量中?
答:这需要以下SAO代码:
提供一种静态参数的方法,该方法使用@Value在此方法上注入属性值,并在此方法中分配一个静态变量值。
一些小心的朋友可能会发现@value注释在setUsername方法上使用,即相应的setter方法,而不是在变量上。
有趣,有趣的是,这种用法有点高。
但是,通常,我们通常使用Lombok的@Data,@setter,@Getter等。实际上不是方法。
上面的内容用于字符串类型变量的示例。实际上,@值注释还支持注入其他类型的系统属性值。
众所周知,Java中有4种基本数据类型,但让我们一起审查:
相应地提供了八个包装类别:
@Value注释对这8的基本类型和相应的包装类别有很好的支持,例如:
使用这些常用的数据类型,当我们定义可变类型时,我们可以非常高兴地发挥作用,而无需进行额外的转换。
但是,使用上面的基本类型还不足,尤其是在许多需要批次处理数据的情况下。此时可以使用它,并且在日常开发中使用高频。
定义数组时,我们可以这样写:
Spring使用逗号默认情况下将参数值分开。
例如,如果空间分开,例如:
弹簧将自动删除空间,从而在数据中仅产生一个值:12345。请注意不要犯错误。
顺便说一句,在定义数组时,内部仍然有很多方法。例如,在上面列表中,我的数据是:1,2,3,4,5。
如果我们将数组定义为:短,int,long,char,string,spring可以正常注入属性值。
但是,如果阵列定义为:float,double类型,则在启动项目时将直接报告错误。
小朋友,你震惊了他的下巴吗?
有理由认为1,2,3,4,5可以用浮点和双重代表。您为什么报告错误?
如果您使用int包,例如::
启动项目时,它还将报告上述异常。
另外,在定义数组时,您必须注意属性值的类型。它必须完全一致。如果发生以下情况:
属性值包含1.0和ABC,显然无法将字符串转换为int。
使用基本类型和数组,它确实更加方便。但是数据的处理不足以使用数组的数据结构。以下引入了其他常用的数据结构。
6.3.1 listList是数组的变体,其长度是可变的,并且数组的长度已固定。
让我们看看列表如何注入属性值:
最重要的是查看配置文件:
当您以Hope启动项目时,您可以使用此功能,但是您发现您已经报告了错误。
什么?
@Value似乎不支持此直接列表注入。
那么,如何解决这个问题?
有人说。
您需要定义MyConfig类:
然后这样写:
这种方法确实可以完成列表注入。但是,只能解释说@configurationProperties有一个有力的音符。它与@Value有关系吗?
答:不。
因此,问题是,如何使用@Value实现此功能?
答:使用春季EL表达式。
列表的定义已更改:
使用数字增加括号的EL表达。
然后将配置文件更改为:
像定义数组时的配置文件一样。
6.3.2设定集也是用于保存数据的数据集合。这很特别,并且内部存储的数据将不会重复。
我们可以定义这样的集合:
配置文件就是这样:
集与列表非常相似。
但是,为了证明本节的独特性,我计划说些新鲜的话。
如何将默认值设置为列表或设置?
一些朋友可能会说:这并不容易,添加A: @value $表达式之后的数字是不够的。
特定代码如下:
结果与想象力不同:为什么集合集合不为空,而是包含一个空字符串的集合?
好吧,我是:在数字之后添加null,还可以吗?设置集合不是空的,而是包含“ null”字符串的集合。
这还不够,那是不好的,应该有什么好处?
答:使用EL表达式的方法。
特定代码如下:
运行后,结果是正确的:
实际上,列表也有类似的问题,也可以使用此方法来解决问题。
在这里让我提醒我,判断的表达相对复杂,手工写错误很容易。建议在复制和粘贴后更改它。
6.3.3 MAP还具有更常用的集合是MAP,它支持密钥/值键 - 值对的形式以保存数据,并且不会显示相同的密钥数据。
我们可以这样定义地图:
配置文件就是这样:
此用法与上述使用略有不同。
设置默认值的代码如下:
早些时候,我们已经看到了弹簧EL表达式的用法,在设置空气的默认值时,这特别有用。
实际上,该方法只是一种非常普遍的用法,并且使用更高的用法。我们不相信我们看看。
过去,我们注入了bean,通常使用@Autowired或@Resource Annotation。例如:
但是我想告诉你的是,@Value注释也可以注入BEAN,这已完成:
这样,您可以注入Ideservice的豆。
通过EL表达式,@value注释已经可以注入BEAN中。现在您可以获取Bean实例,您可以进一步走。
在《典范类别:成员变量》,常数,方法,静态方法中。
在您致电的地方写书:
在“用户服务类”中,您可以通过@Value注入它:成员变量,常数,方法和静态方法获得的值向相应的成员变量。
突然有一种快乐的感觉。有了这些,我们可以通过@Value注释实现更多功能,不仅限于注入系统属性。
以前的内容基于BEAN,但有时我们需要调用静态类,例如:数学,XXXUTIL和其他静态工具,我该怎么办?
答:使用t添加括号。
示例1:
可以将系统的路径分离器注入路径。
示例2:
您可以在随机值中注入一个随机数。
通过上面介绍的内容,我们可以获取大多数类别的变量和方法的值。但是有了这些值,这还不够。我们可以在EL表达中添加一些逻辑吗?
字符串字符串:
逻辑判断:
三眼操作:
有很多功能,我不会一个一个列出它们。
El表达太强大了。如果您对此感兴趣,可以私下与我交谈。
上面的巴拉巴拉(Barlabara)说了很多 @Value的公牛,最底层的是和平的使用。
以下重点是$ {}和#{}之间的区别,这可能是许多朋友更关心的话题。
它主要用于在配置文件中获取系统属性值。
例如:
您可以设置默认值。如果在配置文件中找不到susan.test.username的配置,则注入时使用默认值。
如果在配置文件中找不到susan.test.username的配置,并且没有默认值,则在启动项目时将报告错误。
它主要用于通过弹簧的EL表达获得BEAN的属性,或称呼bean的方法。也有静态常数和静态呼叫类的方法。
如果这是类的静态方法,则需要添加一个(软件包名称 +方法名称)。
例如:t(java.lang.math)。
好吧,这里是在这里介绍,希望它对您有所帮助。