Springboot开发开发技术以及易错点调整-21

了解IOC和DI

Ioc(Inversion of Control)控制反转

在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。理解好Ioc的关键是要明白以下两点:

  • 谁控制谁,控制什么?是由Ioc容器来控制对象的创建,而不是传统的在对象内部通过new进行创建对象。主要控制的就是外部资源的获取(不仅仅是java对象还包括文件等)
  • 为何是反转,哪些方面反转了?反转是指由容器来帮忙创建及注入依赖对象,而不是像传统开发在内部通过new主动创建依赖,所反转的是依赖对象的获取过程被反转了。

IoC是一个重要的面向对象编程的法则,指导如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,
把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合。

DI(Dependency Injection)依赖注入

组件之间的依赖关系由容器在运行期决定,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的主要目的为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。 理解DI的关键是要理解以下内容:

  • 谁依赖于谁?当然是应用程序依赖于IoC容器;
  • 为什么需要依赖?应用程序需要IoC容器来提供对象需要的外部资源;
  • 谁注入谁?很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
  • 注入了什么?就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。;

IoC和DI本质上是对同一个概念的不同角度描述。这里有一个关键的组织者就是IoC容器,Ioc容器具有依赖注入功能的容器,IoC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。应用程序无需直接在代码中new相关的对象,应用程序由IoC容器进行组装。它的存在可以让服务消费者不直接依赖于服务提供者的组件设计方式,符合减少类与类之间依赖的设计原则。

Bean作用域

在面向对象程序设计中一般指对象或变量之间的可见范围。而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。 Spring提供“singleton”和“prototype”两种基本作用域,另外提供“request”、“session”、“global session”三种web作用域。

application配置文件特殊用法

使用配置中的变量

可以使用${}直接使用spring配置文件中的变量,比如:

spring.application.name = springdemoapiGroupName = ${spring.application.name}

使用随机数

要是应对重复的可能性,比如端口号。这样也方便注册中心的管理。

#10之间的随机数
server.port=${random.int(10)}
#10~20之间的随机数
server.port=${random.int[10,20]}

多模块配置文件

SpringBoot从2.4.x版本开始支持了通过spring.config.import属性导入多种途径的配置文件。spring.config.import属性允许我们在主配置文件中引入其他配置文件,这使得配置文件更加模块化,易于维护和管理。之后就可以用@ConfigurationProperties或@Value来注入使用了。

  • classpath: 导入classpath下的配置文件
spring:config:import:# 导入src/main/resource/default.properties配置文件- classpath:/default/default.properties# 导入src/main/resource/service.yml配置文件- classpath:/service/service.yml
  • optional: 导入系统目录下的配置文件
spring:config:import:# 导入系统目录/Users/yuqiyu/Downloads/system.properties配置文件- optional:/Users/yuqiyu/Downloads/system.properties
  • 导入Nacos配置中心的配置文件
spring:config:import:# 导入nacos配置中心的配置文件- optional:nacos:spring-config-import-example.yaml

命令行启动参数配置

命令行运行

在用命令行方式启动 SpringBoot 应用时,连续的两个减号 – 就是对 application.properties 中的属性值进行赋值的标识,比如下列命令,将添加/替换掉application.properties中同名的属性。

java -jar xxx.jar --server.port=8888

springboot配置优先级,从高到低:
命令行–操作系统(System.getProperties())–系统环境变量(Enviorent)–application-profile.properties–application.properties
需要注意读取properties文件时先读jar外的同路径文件再读jar包中的同名文件。

设置Macos系统JDK

打开终端,编辑.bashrc或.bash_profile文件,一般是编辑.bash_profile文件,添加以下行:

export JAVA_HOME=/path/to/your/jdk
export PATH=$JAVA_HOME/bin:$PATH

然后执行

source ~/.bash_profile

指定JDK版本执行

这个命令在mac下好用,/java21是随意写的一个值,测试后,发现其是采用代码编译的版本,同时再查找本地是否有相应的JDK。

JAVA_HOME=/java21 java -jar your-application.jar

另一个官方命令如下,但在mac下不好用,不知道为啥

java -Djava.home=/opt/jdk1.8.0_231 -jar your-application.jar

核心注解

@Configuration

通过@Configuration注解的类将被作为配置类使用,使用@Configuration 注解的类本身也是一个Bean,同时@Configuration在实现上也会被@Component注解,所以不需要再有@Component标识。

import org.springframework.context.annotation.Configuration;
@Configuration("ctxConfig")
public class ApplicationContextConfig {
//定义Bean配置元数据 
}

@ConfigurationProperties

一般要和类的@Component一起使用,目的是将使用了 @ConfigurationProperties 注解的配置类生效,将该类注入到 IOC 容器中统一管理。

@Component
@EnableConfigurationProperties(DemoConfig.class)
public class Test implements ApplicationRunner {@AutowiredDemoConfig demoConfig;@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println(demoConfig);}
}

@Bean

@Bean注解主要用于标识在方法上,同时方法所在的类也要用@Component标识。方法名默认就是Bean名,该方法返回值就是Bean对象。

@Bean
@Scope(value="prototype")
public Printer prototypePrinter() {return new Printer();}@Bean
@Scope(value="singleton")
public Printer singletonPrinter() {return new Printer();
}

@Import

这个注解主要用于类上,它可以把非bean变成一个bean类(即不在springboot扫描范围内的类)。此注解一般也被设计用于模块化配置类。

@Import({TestBean1.class,ImportBeanByConfig.class,ImportBeanByImportSelector.class,ImportBeanByImportBeanDefinitionRegistrar.class})
@Configuration
public class ImportTest {//这种用法是TestBean1不被spring扫描到,这样才有意义@Autowired(required = false)private TestBean1 testBean1;}

ImportSelector接口

另一种用ImportSelector接口实现的示例如下,注意这里引入的是实现类的名称,这种方法适合在外部组织引入的模块化。方法中annotationMetadata参数表示当前被@Import注解给标注的所有注解信息。

public class ImportBeanByImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {// 这里全类名return new String[]{"com.gzl.cn.springbootcache.config.TestBean3"};}
}//使用
@Import({ImportBeanByImportSelector.class})

ImportBeanDefinitionRegistrar接口

另一种更方便的实现方法如下,其用法同ImportSelector接口一样。

public class ImportBeanByImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestBean4.class); // 这里类名registry.registerBeanDefinition("TestBean4", rootBeanDefinition);}
}

@RequestMapping

这个注解表示通用的GetMapping和PostMapping,但使用起来有点实践上的区别,RequestMapping配合通配符使用,可以起到模块划分的作用。即在类上面注解会比较合适。

  • 多个URL映射到同一地址:@RequestMapping(value={“/test1”, “/user/create”}):
  • 过滤请求:@RequestMapping(params=“submitFlag=create”, method=RequestMethod.GET),表示只接受请求中有
    “submitFlag=create”请求参数且请求方法为“GET”的URL地址;
  • 只对请求头为“Content-Type:application/json”的进行请求处理:@RequestMapping(value = “/request/ContentType”, method = RequestMethod.POST, headers = “Content-Type=application/json”)
//类似URL为/api/user/的请求全部转到这个模块,这样也方便异常处理
@Controller
@RequestMapping("/api/user/")
public class ReadingListController {}

@Profile

当应用程序需要部署到不同的运行环境时,一些配置细节通常会有所不同。比如,数据库连 接的细节在开发环境下和测试环境下就会不一样,在生产环境下又不一样。

@Profile("production")
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {}

使用@Profile注解要求运行时激活production Profile,这样才能应用该配置。可以启动时指定,也可以在配置文件中配置,比如:

$ java -jar readinglist-0.0.1-SNAPSHOT.jar --spring.profiles.active=production

SpringBootTest测试

有几个特殊的注解需要理解下:

  • @RunWith(SpringJUnit4ClassRunner.class):引入 Spring对 JUnit4的支持,一般不太使用;
  • @SpringApplicationConfiguration (classes= HelloApplication. class):指定SpringBoot的启动类;
  • @WebAppConfiguration:开启 Web 应用的配置,用于模拟 ServletContexto MockMvc对象;
  • Mockery.java:jMock核心类,用于创建Mock对象的,通过其mock方法来创建相应接口或类的Mock对象。

一个完整的例子如下:

public class GoodsHibernateDaoUnitTest {//Mock对象上下文,用于创建Mock对象, ClassImposteriser.INSTANCE表示可以支持Mock非接口类,默认只支持Mock接口private final Mockery context = new Mockery() {{setImposteriser(ClassImposteriser.INSTANCE);}};//Mock IGoodsCodeDao接口private IGoodsCodeDao goodsCodeDao = context.mock(IGoodsCodeDao.class);@Beforepublic void setUp() { }@Testpublic void testSave () {final GoodsModel expected = new GoodsModel();//8、定义预期行为,并在后边来验证预期行为是否正确(可选)context.checking(new org.jmock.Expectations() {goodsCodeDao.get(GoodsModel.class, 1)  //调用一次goodsCodeDao.get()方法,且参数必须为1.one().will(returnValue(expected)); //返回值});GoodsModel actual = goodsDao.get(1); //验证第8步定义的预期行为是否正确执行了(可选)context.assertIsSatisfied(); //验证goodsDao.get(1)返回结果是否正确 , expected是一个事先定义好的变量Assert.assertEquals(goods, expected);}

切换日志组件

默认情况下,Spring Boot会用Logback(http://logback.qos.ch)来记录日志,并用INFO级别输 出到控制台。如果决定使 用Log4j或者Log4j2,那么你只需要修改依赖,引入对应该日志实现的起步依赖,同时排除掉 Logback。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j</artifactId>
</dependency>

开发自己的springboot-starter

有一个叫spring cloud starts是一个基础的starts版本。

Maven相关

Maven内置变量

maven 内置变量 Maven 提供了一些内置的变量,称为"内置属性",可以在项目的pom.xml文件中直接使用。使用示例如下:

<build><directory>${project.basedir}/target</directory><outputDirectory>${project.build.directory}/classes</outputDirectory><finalName>${project.artifactId}-${project.version}</finalName>
</build>
  1. 基于项目的变量
    • {basedir}: 项目根目录
    • ${version}:项目版本
    • ${project.basedir}:项目的根目录,即包含 pom.xml 文件的目录。
    • ${project.baseUri}:项目的文件地址(URI)。
    • ${project.groupId}:项目的 groupId。
    • ${project.artifactId}:项目的 artifactId。
    • ${project.version}:项目的版本。
    • ${project.packaging}:项目的打包方式,如 jarwar 等。
    • ${project.name}:项目的名称。
    • ${project.description}:项目的描述。
    • ${project.build.directory}:构建生成的文件存放的目录,默认为 ${project.basedir}/target
    • ${project.build.outputDirectory}:主代码编译后的输出目录,默认为 ${project.build.directory}/classes
    • ${project.build.sourceDirectory}:主代码的源目录,默认为 src/main/java
    • ${project.build.testSourceDirectory}:测试代码的源目录,默认为 src/test/java
    • ${project.build.testOutputDirectory}:测试代码编译后的输出目录,默认为 ${project.build.directory}/test-classes
    • ${project.build.finalName} 产出物名称,缺省为 ${project.artifactId} - ${project.version}
  2. 设置和环境变量
    • ${settings.localRepository}:本地仓库的路径。
    • ${env.JAVA_HOME}:Java 安装目录的环境变量。
    • ${env.MAVEN_OPTS}:传递给 Maven JVM 的参数。
  3. 时间和构建相关
    • ${maven.build.timestamp}:构建开始的时间戳。
    • ${maven.build.timestamp.format}:构建开始时间的格式化字符串,默认为 yyyyMMdd-HHmm
  4. Maven 系统属性
    • 这些是 Java 系统属性,可以通过 System.getProperty() 访问,也可以在 Maven 中使用。例如 ${java.version}${os.name} 等。
  5. 命令行属性
    • 你可以在 Maven 命令行中通过 -D 参数设置自定义属性。例如 mvn install -DmyProp=myValue,然后在 POM 或构建脚本中通过 ${myProp} 引用它。

SpringBoot-maven插件

主要功能包括: 打包你的应用为一个可执行的JAR或WAR,包含所有必要的类和资源,可以在生产环境中执行,内嵌了Tomcat, Jetty, Undertow。如果不提供这个插件,则用maven package指令打包后的应用不能正常运行,因为没有依赖包。

<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId>
</plugin>mvn clean package
mvn spring-boot:run

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/8013.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

质数是无穷的吗?

质数是无穷的吗&#xff1f;还是存在一个最大的质数&#xff0c;一旦超过这个质数后&#xff0c;每个比它大的数都可以表示为我们已知质数的乘积&#xff1f;欧几里得本人最先提出这个问题&#xff0c;他以一种极其简单而优雅的方式&#xff0c;指出质数有无穷多个&#xff0c;…

Jenkins的原理及应用详解(二)

本系列文章简介&#xff1a; Jenkins是一种自动化构建工具&#xff0c;它的出现使得软件开发过程变得更加高效、可靠和可持续。它采用了一种事件驱动的架构&#xff0c;能够通过触发不同的事件来执行相应的构建任务和操作。Jenkins支持多种版本控制系统的集成&#xff0c;可以自…

WordPress原创插件:当日24小时发布文章标题变红

WordPress原创插件&#xff1a;当日24小时发布文章标题变红 <?php// 添加自定义样式 function title_red_plugin_styles() {$current_time time();$post_time get_the_time(U);$time_difference $current_time - $post_time;if ($time_difference < 86400) {echo&l…

24_Scala集合Map

文章目录 Scala集合Map1.构建Map2.增删改查3.Map的get操作细节 Scala集合Map –默认immutable –概念和Java一致 1.构建Map –创建kv键值对 && kv键值对的表达 –创建immutable map –创建mutable map //1.1 构建一个kv键值对 val kv "a" -> 1 print…

Web开发:如何将元素边框的直角框设为圆角框

将元素边框的直角框设为圆角框 介绍举例总结 介绍 在Web开发中&#xff0c;我们可以使用CSS的border-radius属性将直角框&#xff08;矩形&#xff09;设为圆角框。border-radius属性允许我们设置一个或多个值&#xff0c;这些值定义了元素边框角的半径。 举例 设置一个值&a…

Web3智能物联网:科技连接的未来世界

在当今科技飞速发展的时代&#xff0c;Web3智能物联网正逐渐成为人们关注的焦点。随着区块链技术的不断成熟和普及&#xff0c;以及物联网的普及和应用&#xff0c;Web3智能物联网作为二者的结合&#xff0c;将为未来的数字世界带来革命性的变化。本文将深入探讨Web3智能物联网…

二十、Java的反射机制

1、Java反射机制的概念 所谓反射从程序的运行结果来看也很好理解,即可以通过对象反射求出类的名称。如下: 正常方式:引入需要的“包.类”名称---->通过new实例化----->取得实例化对象。 反射方式:实例化对象---->getClass()方法------>得到完整的“包.类”名…

基于Django框架课堂投票系统的设计与实现

基于Django框架课堂投票系统的设计与实现 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat、Maven 学生角色功能实现 注册登录界面 此处输入账号并设置登录密码&#xff0c;填写用户名、性别、生源地等相关信息…

视频断点上传

什么是断点续传 通常视频文件都比较大&#xff0c;所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大小没有限制&#xff0c;但是客户的网络环境质量、电脑硬件环境等参差不齐&#xff0c;如果一个大文件快上传完了网断了没有上传完成&#xf…

【busybox记录】【shell指令】tr

目录 内容来源&#xff1a; 【GUN】【tr】指令介绍 【busybox】【tr】指令介绍 【linux】【tr】指令介绍 使用示例&#xff1a; 转换字符 - 默认 转换字符 - 不翻译指定字符数组 此指令目前接触少&#xff0c;用得少&#xff0c;把精力放到其他常用指令上 常用组合指令…

CP AUTOSAR之CANXL Driver详细说明(正在更新中)

本文遵循autosar标准&#xff1a;R22-11 1 简介及功能概述 本规范描述了AUTOSAR 基础软件模块CAN XL 驱动程序的功能、API和配置。   本文档的基础是[1,CiA610-1]和[2,CiA611-1]。假设读者熟悉这些规范。本文档不会再次描述CAN XL 功能。   CAN XL 驱动程序是最低层的一部…

125.两两交换链表中的节点(力扣)

题目描述 代码解决及思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), …

go context详解

Context 在Go语言圈子中流行着一句话&#xff1a; Never start a goroutine without knowing how it will stop。 翻译&#xff1a;如果你不知道协程如何退出&#xff0c;就不要使用它。 在创建协程时&#xff0c;我们可能还会再创建一些别的子协程&#xff0c;那么这些协程的…

一篇迟来的未来展望的博客

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 老师布置的任务&#xff0c;叫写一篇博客&…

04.2.配置应用集

配置应用集 应用集的意思就是&#xff1a;将多个监控项添加到一个应用集里面便于管理。 创建应用集 填写名称并添加 在监控项里面找到对应的自定义监控项更新到应用集里面 选择对应的监控项于应用集

【Sql-02】 求每个省份最新登陆的三条数据

SQL 输出要求数据准备sql查询结果 输出要求 要求输出&#xff0c;userid_1,logtime_1,userid_2,logtime_2,userid_3,logtime_3 数据准备 CREATE TABLE sqltest (province varchar(32) NOT NULL,userid varchar(250) DEFAULT NULL,logtime datetime ) ENGINEInnoDB DEFAULT C…

【Halcon 内存泄漏记录 - C#】

Halcon 内存泄漏记录 - C# 1. Bitmap 转 HImage2. new 之后要Dispose() 1. Bitmap 转 HImage 由于Bitmap 在转化时使用BitmapData数据&#xff0c;BitmapData数据无法Dispose, 所以在使用时&#xff0c;使用using&#xff1a; try{using (Bitmap b bmp.Clone() as Bitmap){if…

如何在 CentOS 7 上为 Nginx 创建自签名 SSL 证书

简介 TLS&#xff0c;即传输层安全性&#xff0c;及其前身SSL&#xff0c;即安全套接字层&#xff0c;是用于将普通流量包装在受保护的加密包中的网络协议。 使用这项技术&#xff0c;服务器可以在服务器和客户端之间安全地发送流量&#xff0c;而不会被外部方拦截。证书系统…

深度学习--生成对抗网络GAN

GAN简介 让我们先来简单了解一下GAN GAN的全称是Generative Adversarial Networks&#xff0c;中文称为“生成对抗网络”&#xff0c;是一种在深度学习领域广泛使用的无监督学习方法。 GAN主要由两部分组成&#xff1a;生成器和判别器。生成器的目标是尽可能地生成真实的样本数…

如何创建微信小程序?只需3步完成小程序制作

微信&#xff0c;中国最大的社交媒体应用程序&#xff0c;几个月前推出了微信小程序&#xff0c;这一神奇的功能立即大受欢迎。这些小程序让在中国注册的商业实体所有者创建一个小程序来与微信用户互动。这些小程序不需要在用户手机上进行任何安装&#xff0c;只需通过微信应用…