spring boot _20191220_汇总

本文详细介绍SpringBoot项目搭建流程,包括Maven项目创建、依赖导入、主程序编写及资源映射配置。深入解析@SpringBootApplication注解,配置文件加载机制,自动配置原理,以及实战案例,如静态资源管理、错误页面定制等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、构建springboot项目并输出helloword

1、创建maven项目
2、导入springboot依赖
3、编写一个主程序用于启动springboot应用
4、编写一个主程序启动springboot
/*
*@SpringBootApplication注解用来表明这是一个springboot应用
**/
@SpringBootApplication
publicclassStartSpringBoot{
	//spring应用启动起来
	publicstaticvoidmain(String[]args){
		SpringApplication.run(StartSpringBoot.class);
	}
}
5、编写conllector或service
	@Controller
	publicclassHelloConltroller{
		@RequestMapping("/hello")
		@ResponseBody
		publicStringgetHello(){
			return"helloword";
		}
	}


其实上面的都不需要做,spring官网直接初始化

二、使用Spring Initializer快速创建Spring boot项目

IDE都支持使用Spring的项目创建向导快速创建一个Spring boot项目;
创建好之后会有一个resources资源文件夹,这个文件夹下会包含以下文件
static:保存所有的静态资源;js css images
templates:保存所有的模板页面;
Application.properties:spring boot应用的配置文件;可以用来修改一些默认的设置。

三、配置文件

1、Spring boot使用一个全局的配置文件
	a、application.properties
	b、application.yml
	配置文件的作用:修改springboot自动配置的默认值;springboot在底层都给我们配置好了。
yml:以数据为中心,比json、xml等更适合做配置文件

yml的基本语法:
	yml是以键值对来书写的;K:(空格) v;k后面的的冒号必须和v之间有个空格。
	以空格来控制层级关系;只要是左对齐的一列数据,都是同一层级。比如下面的port和path为同一层级。
	Sercer:
		Port: 8080
		Path: /hello
	下面介绍yml值的写法
		字面量:普通的值(数字、字符串、布尔)
			k: v:字面直接来写
			字符串默认不用加上单引号或者双引号;
			“”:双引号括起来的,不会转义字符串里面的特殊字符,比如\n会当作换行来表示。
			‘’:单引号括起来的k值,会转义特殊字符,\n会当作\n字符串输出。
		对象(属性和值)、map(键值对):
			k: v:在下一行来写对象的属性和值的关系;注意缩进
			对象还是k: v的方式。比如下面的
			friends: 
					lastname: zhangsan
					Age: 20
			也可以用行内写法:friends: {lastname: zhangsan,age: 20}
		数组的写法:
			用- v表示数组中的一个元素
			pets:
				- 1
				- 2
				- 3
行内写法pets: [1,2,3]

四、spring启动器依赖的导入

在web项目中我们会导入

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
web启动器的依赖(当我们没导入这个依赖就会发现找不到@RequestMapping注解)
我们需要根据场景的不同选择不同的依赖,redis导入redis的启动器依赖,JDBC导入JDBC的启动器依赖,启动器依赖在spring官网有说明

等等

Spring.io找到projects再到springboot再到learn点击reference,搜索starter

五、@SpringBootApplication注解解析

@SpringBootApplication :spring boot应用。当把此注解标注在类上,说明这个类试spingboot的主配置类,spring boot就是应用运行这个类的main方法来启动spingboot应用。

当我们点进去这个注解会发现里面包含以下的注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

其中@SpringBootConfiguration:springboot的配置类;
@Configuration:配置类上来标注这个注解;
配置类----配置文件;配置类也是容器的中的一个组件;


@EnableAutoConfiguration注解:开启自动配置功能。
	以前我们需要配置的东西,springboot帮我们自动配置;@EnableAutoConfiguration 注解告诉我们springboot开启了自动配置功能;这样自动配置才能生效。
	@EnableAutoConfiguration这个注解又包含以下注解
	@AutoConfigurationPackage
	@Import({AutoConfigurationImportSelector.class})
	
	@AutoConfigurationPackage:自动配置包
		@Import({AutoConfigurationImportSelector.class})
		spring的底层注解@Import,给容器导入一个组件;导入的组件由AutoConfigurationPackage.Registrar.Calss;
		将主配置(@Spring Boot Application标志的类)的所有在包及下面所有子包里面的所有组件扫描到Spring容器;
		@Import(EnableAutoConfigurationImportSelector.Class):给容器中导入组件。
		EnableAutoConfigurationImportSelector.Class导入那些组件的选择器。将所有需要导入的组件以全类名的方式返回,并将这些组件添加到容器中。这个类里面将会用this.getCandidateConfigurations方法来得到所需的配置。
		有了自动配置类,我们将免去手动编写配置注入功能组件的工作等。

六、配置文件加载位置

spring boot启动会扫描以下位置的application.properties或者application.yml文件作为springboot的默认配置文件
-file:./config/
-file:./
-classpath:/config/
-以上是按优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖底优先级配置内容
-也可以通过配置spring.config.location来改变默认配置(通过命令行配置)

七、Springboot自动配置原理

1、springboot启动会加载大量的自动配置类
2、我们看我们需要的功能有没有springboot默认配置类
3、我们看spring boot是否已经给我们配置
4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的值。

xxxAutoConfiguration:这个类代表自动配置类,给容器中添加组件

xxxProperties:这个类是封装上面自动配置类配置文件中的相关属性

这两个结合在一起便是,首先springboot通过添加xxxAutoConfiguration组件,通过xxxProperties为组件的属性赋值,值则是配置文件读取到。例如你配置的数据库类型,名字,密码,都是通过DataProperties读取到并封装,然后通过DataAutoConfiguration给到ioc。

八、spring boot web 实战

我们从WebMvcAutoConfiguration这个类中找到addResourceHandlers这个方法,里面有下面这行代码
a、this.customizeResourceHandlerRegistration(registry.addResourceHandler(newString[]{"/webjars/**"}).addResourceLocations(newString[]{"classpath:/META-INF/resources/webjars/"}).setCachePeriod(this.getSeconds(cachePeriod)).setCacheControl(cacheControl));
b、“classpath:/META-INF/resources/”  "classpath:/resources/"    "classpath:/static"   "classpath:/public/"  "/"(当前项目的根路径)
springboot对静态文件的映射规则:
	1. 上面的代码为我们展示webjars静态资源查找规则。
	2. 我们自己也会创建一些js等,那么他的查找位置是b的所有路径
	3. 欢迎页:静态资源文件夹下的所有index.html页面,被/**映射
	4. 所有的**/favicon.ico(浏览器上的小图标)都在静态资源文件下找

项目的类路径(也就是classpath)代表:java包下,java同级目录下的resources包下。

九、如何修改springboot默认配置

1、springboot在自动配置很多组件的时候,先看容器中有没有用户自己配置的,如果有就用用户配置的,如果没有才自动配置;如果有些组件可以有多个,那么将会是将用户配置和springboot默认的组合起来。
2、扩展springmvc:
我们需要编写一个具有@Configuration注解配置类,并且这个类是WebMvcConfigurerAdapter类型;不能标注@EnableWebMvc注解。一旦标注我们将全面接管springmvc的配置,springboot的配置将不起作用;不加的话,springboot的配置和我们的配置将同时生效,自己的配置将有可能覆盖springboot的配置
@Configuration
publicclassIMvcConfigextendsWebMvcConfigurerAdapter{
	/*下面的方法将会改变springboot默认配置的欢迎页*/
	@Bean//将组件注册在容器中
	publicWebMvcConfigurerAdapterwebMvcConfigurerAdapter(){
	WebMvcConfigurerAdapter adapter=newWebMvcConfigurerAdapter(){
	@Override
	publicvoidaddViewControllers(ViewControllerRegistryregistry){
	registry.addViewController("/").setViewName("login");
	registry.addViewController("/index.html").setViewName("login");
	}
	};
	returnadapter;
	}
}
上面是一个修改默认配置的demo。

十、登录

1、登录的链接我们以前用requestmapping,现在我们post请求直接可以用@PostMapping注解   
2、防止表单重复提交我们可以将转发变为重定向。具体实现如下
	a、将链接注册到spring容器registry.addViewController("/main.html").setViewName("success");
	b、使用return"redirect:/main.html";重定向到页面
	(return"forword:/main.html"转发到页面);
3、登录拦截器
a、首先我们需要建一个实现HandlerInterceptor接口的类如下
publicclassLoginHandlerInterceptorimplementsHandlerInterceptor{
//目标方法执行前
@Override
publicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{
	Objectname=request.getSession().getAttribute("name");
	if(name==null){
	//未登录,返回登录页面
	request.getRequestDispatcher("/index.html").forward(request,response);
	request.setAttribute("msg","没有访问权限");
	returnfalse;
	}else{
	//登录
	returntrue;
	}
}
@Override
publicvoidpostHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,ModelAndViewmodelAndView)throwsException{
}
@Override
publicvoidafterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler,Exceptionex)throwsException{
}
}
b、将这个类注册到spring容器中,我们需要创建WebMvcConfigurerAdapter的匿名内部类,并重写addInterceptors方法
WebMvcConfigurerAdapteradapter=newWebMvcConfigurerAdapter(){
	@Override
	publicvoidaddViewControllers(ViewControllerRegistryregistry){
		registry.addViewController("/").setViewName("login");
		registry.addViewController("/index.html").setViewName("login");
		registry.addViewController("/main.html").setViewName("success");
	}
	//注册拦截器
	@Override
	publicvoidaddInterceptors(InterceptorRegistryregistry){
		//super.addInterceptors(registry);
		//springboot已经做好了静态资源映射,不需要排除静态资源路径
		registry.addInterceptor(newLoginHandlerInterceptor()).addPathPatterns("/**")
		.excludePathPatterns("/index.html","/user/login","/");
	}
};

十一、定制错误页面

定制错误响应
1 、如何定制错误页面
	有模板引擎的情况,找error下的状态码,在thymeleaf模板引擎下会在templates文件夹下找error文件夹,
		然后找到对应的404/500页面;我们创建html错误页面时【将错误页面命名为 错误状态码.html,
		并置于error文件夹下】,发生错误就会来到对应的页面,如果想把4开头的错误码都放到一个类型的页面,
		我们可以将页面命名为4xx,5开头的则命名为5xx。
	在没有模板引擎的情况下,会在静态资源文件夹下找error文件夹,并从中找到对应的4xx或5xx页面。
	模板引擎和资源文件夹下都没有,将会来到springboot默认的错误页面(一个自己代码内部组装的页面会响应到html)。
2、如何定制错误json数据

在这里我们将会得到3个类:
1、DefaultErrorAttributes;
响应到对应的页面:
		页面可以获取的信息
		timestamp:时间戳
		status:状态码
		error:错误提示
		exception:异常对象
		message:异常消息
		errors:jsr303数据校验信息

2、BasicErrorController;处理默认/error请求

3、ErrorPageCustomizer;
@value("${error.path:/error}")
Private String path = "/error";
当系统出现错误以后,来到/error请求处理;(类似于web.xml注册的错误页面规则)
4、DefaultErrorViewResolve:
步骤:
	一旦系统出现4xx或者5xx之类的错误;ErrorPagerCustomizer就会生效(定制错误的相应规则);就会发一个/error请求,error请求会被BasicErrorController这个类处理。

 

MPU6050是一款广泛应用在惯性测量单元(IMU)中的微型传感器,由InvenSense公司生产。它集成了三轴加速度计和三轴陀螺仪,能够检测设备在三维空间中的线性加速度和角速度,进而计算出物体的姿态、运动和方向。在本项目中,MPU6050被用来获取设备的YAW、PITCH、ROLL这三个关键的姿态角,这些数据将通过OLED显示屏进行实时显示。 1. **MPU6050工作原理**: MPU6050内部包含两个主要传感器:加速度计用于测量重力加速度,提供X、Y、Z三个轴的线性加速度信息;陀螺仪则测量绕三个轴的旋转速率。通过融合这两个传感器的数据,可以计算出设备的动态运动状态。 2. **姿态角的定义**: - **YAW(偏航角)**:表示设备相对于一个参考方向的旋转角度,通常以水平面为基准。 - **PITCH(俯仰角)**:是设备沿垂直轴相对于水平面的倾斜角度,向上为正,向下为负。 - **ROLL(翻滚角)**:是设备围绕前向轴的旋转角度,向右为正,向左为负。 3. **数据处理与姿态解算**: 为了从原始的加速度和角速度数据中获取准确的姿态角,需要应用卡尔曼滤波、互补滤波或者Madgwick算法等高级数据融合方法。这些算法可以有效地消除噪声,提高姿态估计的稳定性和精度。 4. **OLED显示屏**: OLED(有机发光二极管)显示器是一种自发光技术,具有高对比度、快速响应时间以及广视角的优点。在该项目中,OLED用于实时显示YAW、PITCH、ROLL角,为用户提供了直观的视觉反馈。 5. **硬件连接与编程**: 实现这一功能需要将MPU6050通过I2C或SPI接口连接到微控制器(如Arduino、Raspberry Pi等)。编写相应的固件程序来读取传感器数据,并将其转换为姿态角,然后将结果显示在OLED屏幕上。 6. **软件实现**: 在编程过程中,通常会用到相关的库文件,如Arduino IDE中的Wire库来处理I2C通信,Adafruit的MPU6050库来与传感器交互,以及Adafruit_GFX和Adafruit_SSD1306库来驱动OLED屏幕。 7. **调试与优化**: 项目实施过程中可能遇到的问题包括传感器漂移、数据不准确等,可以通过调整滤波器参数、校准传感器以及优化算法来改善。 综上,"MPU6050(OLED显示姿态角)"项目涉及了传感器技术、微控制器编程、数据融合算法、嵌入式显示等多个领域的知识,对于学习和实践物联网、机器人、无人机等领域的开发者来说,是一个很好的动手实践项目。
基于C#开发的一个稳定可靠的上位机系统,旨在满足工业控制的需求。该系统集成了多个功能界面,如操作界面、监控界面、工艺流显示界面、工艺表界面、工艺编辑界面、曲线界面和异常报警界面。每个界面都经过精心设计,以提高用户体验和工作效率。例如,操作界面和监控界面对触摸屏友好,支持常规点击和数字输入框;工艺流显示界面能够实时展示工艺步骤并变换颜色;工艺表界面支持Excel和加密文件的导入导出;工艺编辑界面采用树形编辑方式;曲线界面可展示八组曲线并自定义纵坐标数值;异常报警界面能够在工艺流程出现问题时及时报警。此外,该系统还支持与倍福TC2、TC3和西门子PLC1200/300等下位机设备的通信,确保生产线的顺畅运行。系统参考欧洲工艺软件开发,已稳定运行多年,证明了其可靠性和稳定性。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对C#编程有一定基础的人群。 使用场景及目标:适用于需要构建高效、稳定的工业控制系统的企业和个人开发者。主要目标是提升生产效率、确保生产安全、优化工艺流程管理和实现数据的有效管理与传输。 其他说明:文中提供了部分示例代码片段,帮助读者更好地理解具体实现方法。系统的复杂度较高,但凭借C#的强大功能和开发团队的经验,确保了系统的稳定性和可靠性。
内容概要:本文详细介绍了OpenMV在机器视觉领域的高级应用,涵盖基础回顾、高级功能详解、高级编程技巧、进阶应用场景及实战项目。OpenMV作为基于机器视觉的开源嵌入式系统,广泛应用于工业检测、智能安防、机器人等领域。文中深入探讨了图像处理技术(如滤波、边缘检测、特征检测与匹配、图像分割)、对象检测与跟踪(如Haar级联分类器、深度学习目标检测、卡尔曼滤波)等高级功能。此外,文章还讲解了多线程编程、算法优化、内存管理和并行计算等编程技巧,并展示了OpenMV在工业检测、智能交通和医疗领域的具体应用案例。最后,通过构建智能安防系统的实战项目,演示了OpenMV在入侵检测和人脸识别方面的应用。 适合人群:具备一定编程基础和技术背景的工程师或研究人员,尤其是对机器视觉、嵌入式系统感兴趣的从业者。 使用场景及目标:①掌握OpenMV的基础和高级功能,应用于工业检测、智能安防、机器人等领域的项目开发;②通过多线程编程和性能优化技术,提升程序的运行效率和响应速度;③学习如何利用OpenMV实现图像处理、对象检测与跟踪等复杂任务,满足实际应用场景的需求。 阅读建议:本文内容丰富,涵盖了从理论到实战的各个方面,建议读者结合实际项目需求,逐步学习和实践文中提到的技术和方法。特别是对于高级功能和编程技巧部分,可以通过动手实验加深理解。同时,关注最新的技术和算法进展,以适应不断发展的机器视觉领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子鞋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值