百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Spring不只是依赖注入(Resources)——面试必备

bigegpt 2024-08-08 12:01 2 浏览

之前我一直在谈论依赖注入和代理。 现在首先看一下在Spring框架中所谓的重要便捷实用程序。 这些实用程序之一就是Spring的资源支持。

考虑一下如何尝试通过HTTP或FTP访问Java文件。 您可以使用Java的URL类并编写一些管道代码。

同样,如何从应用程序的类路径中读取文件? 或从Servlet上下文中,这意味着从Web应用程序的根目录(诚然,在现代的packaged.jar应用程序中,这种情况越来越少)。

同样,需要编写大量的样板代码才能正常工作,但不幸的是,每个使用案例(URL,类路径,Servlet上下文)的代码都会不同。

但是有一个解决方案:Spring的资源抽象。 用代码很容易解释。

import org.springframework.core.io.Resource;
?
public class MyApplication {
?
    public static void main(String[] args) {
            ApplicationContext ctx = new AnnotationConfigApplicationContext(someConfigClass); // (1)
?
            Resource aClasspathTemplate = ctx.getResource("classpath:somePackage/application.properties"); // (2)
?
            Resource aFileTemplate = ctx.getResource("file:///someDirectory/application.properties"); // (3)
?
            Resource anHttpTemplate = ctx.getResource("https://marcobehler.com/application.properties"); // (4)
?
            Resource depends = ctx.getResource("myhost.com/resource/path/myTemplate.txt"); // (5)
?
            Resource s3Resources = ctx.getResource("s3://myBucket/myFile.txt"); // (6)
    }
}
  1. 与往常一样,您需要一个ApplicationContext才能开始。
  2. 当在applicationContext上使用以classpath:开头的字符串调用getResource()时,Spring将在..well..application类路径上查找资源。
  3. 当使用以file:开头的字符串调用getResource()时,Spring将在硬盘上查找文件。
  4. 当使用以https :(或http)开头的字符串调用getResource()时,Spring将在Web上查找文件。
  5. 如果未指定前缀,则实际上取决于您配置的applicationContext类型。
  6. 对于Spring Framework,这不是开箱即用的,但是对于Spring Cloud等其他库,您甚至可以直接访问s3://路径。

简而言之,Spring能够通过漂亮的小语法访问资源。 资源接口有两种有趣的方法:

public interface Resource extends InputStreamSource {
?
    boolean exists();
?
    String getFilename();
?
    File getFile() throws IOException;
?
    InputStream getInputStream() throws IOException;
?
    // ... other methods commented out
}

如你所见,它使你可以对资源执行最常见的操作:

  • 是否存在?
  • 文件名?
  • 得到文件引用
  • 直接得到数据(InputStream)

这样就可以使用资源来执行所需的所有操作,而不必依赖网络上,类路径或硬盘上的资源。

资源抽象看起来像是一个很小的功能,但是当与Spring提供的下一个便捷功能:Properties相结合时,它确实会发光。

什么是Spring Env?

任何应用程序的很大一部分都在读取属性,例如数据库用户名和密码,电子邮件服务器配置,Stripe付款明细配置等。

这些属性以最简单的形式存在于.properties文件中,并且可能有很多:

  • 其中一些在类路径中,因此可以访问一些与开发相关的密码。
  • 其他文件可能在文件系统或网络驱动器中,因此生产服务器可以具有自己的安全属性。
  • 有些甚至可能以操作系统环境变量的形式出现。

Spring尝试通过其环境抽象使你轻松注册并自动在所有这些不同源中查找属性。

import org.springframework.core.env.Environment;
public class MyApplication {
?
    public static void main(String[] args) {
           ApplicationContext ctx = new AnnotationConfigApplicationContext(someConfigClass);
           Environment env = ctx.getEnvironment(); // (1)
           String databaseUrl = env.getProperty("database.url"); // (2)
           boolean containsPassword = env.containsProperty("database.password");
           // etc
    }
}
  1. 通过applicationContext,始终可以访问当前程序的环境。
  2. 另一方面,Spring Env使你可以访问属性。

现在,到底什么是Spring ENV?

什么是Spring @PropertySoruces?

简而言之,环境由一对多的属性源组成。 例如:

  • /mydir/application.properties
  • classpath:/application-default.properties

(注意:环境也由配置文件组成,即“开发”或“生产”配置文件,当然这里不涉及这个)。

默认情况下,Spring MVC Web应用程序环境由ServletConfig / Context参数,JNDI和JVM系统属性源组成。 它们也是分层的,这意味着它们具有重要性顺序,并且彼此覆盖。

但是,自己定义新的@PropertySources很容易:

import org.springframework.context.annotation.PropertySources;
import org.springframework.context.annotation.PropertySource;
?
@Configuration
@PropertySources(
        {@PropertySource("classpath:/com/${my.placeholder:default/path}/app.properties"),
         @PropertySource("file://myFolder/app-production.properties")})
public class MyApplicationContextConfiguration {
    // your beans
}

现在更有意义了,为什么我们以前谈论过Spring的资源。 因为两个功能齐头并进。

@PropertySource注解可与任何有效的Spring配置类一起使用,并允许您借助Spring的资源抽象来定义新的其他源:记住,这全都与前缀有关:http://,file://,classpath:等 。

通过@PropertySources定义属性很好,但是没有比必须通过环境访问属性更好的方法了吗? 有!

Spring @Value 和 Property 注入

你可以将属性注入到bean中,就像使用@Autowired批注注入依赖项一样。 但是对于属性,需要使用@Value批注。

import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Value;
?
@Component
public class PaymentService {
?
    @Value("${paypal.password}")  // (1)
    private String paypalPassword;
?
     public PaymentService(@Value("${paypal.url}") String paypalUrl) { // (2)
         this.paypalUrl = paypalUrl;
    }
}
  1. @Value 直接作用在字段上
  2. 或者构造器参数

到这里就差不多了, 每当使用@Value批注时,Spring都会遍历你的(分层)环境并寻找适当的属性-如果不存在这样的属性,则抛出错误消息。


个人博客: https://patrickchen.cn/

相关推荐

【Docker 新手入门指南】第十章:Dockerfile

Dockerfile是Docker镜像构建的核心配置文件,通过预定义的指令集实现镜像的自动化构建。以下从核心概念、指令详解、最佳实践三方面展开说明,帮助你系统掌握Dockerfile的使用逻...

Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译

前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...

python虚拟环境迁移(python虚拟环境conda)

主机A的虚拟环境向主机B迁移。前提条件:主机A和主机B已经安装了virtualenv1.主机A操作如下虚拟环境目录:venv进入虚拟环境:sourcevenv/bin/active(1)记录虚拟环...

Python爬虫进阶教程(二):线程、协程

简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...

基于网络安全的Docker逃逸(docker)

如何判断当前机器是否为Docker容器环境Metasploit中的checkcontainer模块、(判断是否为虚拟机,checkvm模块)搭配学习教程1.检查根目录下是否存在.dockerenv文...

Python编程语言被纳入浙江高考,小学生都开始学了

今年9月份开始的新学期,浙江省三到九年级信息技术课将同步替换新教材。其中,新初二将新增Python编程课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材...

CentOS 7下安装Python 3.10的完整过程

1.安装相应的编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-develope...

如何在Ubuntu 20.04上部署Odoo 14

Odoo是世界上最受欢迎的多合一商务软件。它提供了一系列业务应用程序,包括CRM,网站,电子商务,计费,会计,制造,仓库,项目管理,库存等等,所有这些都无缝集成在一起。Odoo可以通过几种不同的方式进...

Ubuntu 系统安装 PyTorch 全流程指南

当前环境:Ubuntu22.04,显卡为GeForceRTX3080Ti1、下载显卡驱动驱动网站:https://www.nvidia.com/en-us/drivers/根据自己的显卡型号和...

spark+python环境搭建(python 环境搭建)

最近项目需要用到spark大数据相关技术,周末有空spark环境搭起来...目标spark,python运行环境部署在linux服务器个人通过vscode开发通过远程python解释器执行代码准备...

centos7.9安装最新python-3.11.1(centos安装python环境)

centos7.9安装最新python-3.11.1centos7.9默认安装的是python-2.7.5版本,安全扫描时会有很多漏洞,比如:Python命令注入漏洞(CVE-2015-2010...

Linux系统下,五大步骤安装Python

一、下载Python包网上教程大多是通过官方地址进行下载Python的,但由于国内网络环境问题,会导致下载很慢,所以这里建议通过国内镜像进行下载例如:淘宝镜像http://npm.taobao.or...

centos7上安装python3(centos7安装python3.7.2一键脚本)

centos7上默认安装的是python2,要使用python3则需要自行下载源码编译安装。1.安装依赖yum-ygroupinstall"Developmenttools"...

利用本地数据通过微调方式训练 本地DeepSeek-R1 蒸馏模型

网络上相应的教程基本都基于LLaMA-Factory进行,本文章主要顺着相应的教程一步步实现大模型的微调和训练。训练环境:可自行定义,mac、linux或者window之类的均可以,本文以ma...

【法器篇】天啦噜,库崩了没备份(天啦噜是什么意思?)

背景数据库没有做备份,一天突然由于断电或其他原因导致无法启动了,且设置了innodb_force_recovery=6都无法启动,里面的数据怎么才能恢复出来?本例采用解析建表语句+表空间传输的方式进行...