spring boot _20191220_汇总

一、构建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这个类处理。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

子鞋

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

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

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

打赏作者

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

抵扣说明:

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

余额充值