springboot
- 一、SpringBoot简介
- 二、SpringBoot特性
- SpringBoot特性
- 什么是开箱即用?
- 什么是约定优于配置?
- 三、SpringBoot常用注解
- 启动类相关注解
- Controller层相关注解
- Service层相关注解
- Dao层相关注解
- 四、SpringBoot配置
- SpringBoot自动配置原理
- Spring Boot 配置加载顺序
- SpringBoot内部配置文件加载顺序
- Spring Boot 处理跨域问题
- 什么是跨域?
- SpringBoot跨域解决方案
一、SpringBoot简介
Spring Boot 是 Spring 开源组织下的子项目,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架采用“约定大于配置”的方式,提供各种启动器,可以快速构建Spring应用。
二、SpringBoot特性
SpringBoot特性
- 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。
- 开箱即用,远离繁琐的配置。
- 内嵌Tomcat或Jetty等Servlet容器;
- 提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
- 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。
- 没有代码生成,也不需要XML配置。
什么是开箱即用?
开箱即用,Outofbox,是指在开发过程中,通过在MAVEN项目的pom文件中添加相关依赖包,然后使用对应注解来代替繁琐的XML配置文件以管理对象的生命周期。这个特点使得开发人员摆脱了复杂的配置工作以及依赖的管理工作,更加专注于业务逻辑。
什么是约定优于配置?
约定优于配置,Convention over configuration,是一种由SpringBoot本身来配置目标结构,由开发者在结构中添加信息的软件设计范式。这一特点虽降低了部分灵活性,增加了BUG定位的复杂性,但减少了开发人员需要做出决定的数量,同时减少了大量的XML配置,并且可以将代码编译、测试和打包等工作自动化。
三、SpringBoot常用注解
启动类相关注解
- @SpringBootApplication:启动注解,@SpringBootApplication是一个复合注解,包括@ComponentScan, 和@SpringBootConfiguration,@EnableAutoConfiguration
- @SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。
- @EnableAutoConfiguration的作用是启动自动的配置,@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web,来判断你的项目是否需要添加了webmvc和tomcat,就会自动的帮你配置web项目中所需要的默认配置。
- @ComponentScan,扫描当前包及其子包下被@Component,@Controller,@Service,@Repository注解标记的类并纳入到spring容器中进行管理。相当于context:component-scan(spring框架在xml中使用的标签,用来扫描包配置的平行支持)。
- @ServletComponentScan:在SpringBootApplication上使用@ServletComponentScan注解后,Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
- @MapperScan("") :@MapperScan注解只会扫描指定包中的接口,不会扫描类。
- @EnableScheduling: spring自带的定时服务注解,使用于类上,启动定时服务, @Scheduled则是作用于方法上,可以设定方法定时时间
Controller层相关注解
- @Controller: 用来响应页面,表示当前的类为控制器。
- @RestController: 是@ResponseBody和@Controller的结合,表明当前类是控制器且返回的是一组数据,不是页面
- @Autowired:按照类型装配依赖对象
- @Resource:可以按照名称或类型装配对象
- @RequestMapping:作用是URL映射,用于前端界面调用Controller里的具体方法
- @GetMapping:@RequestMapping(method = RequestMethod.GET)的简写,用于处理请求方法的GET类型
- @PostMapping:@RequestMapping(method = RequestMethod.POST)的简写,用于处理请求方法的POST类型
- @PutMapping:@RequestMapping(method = RequestMethod.PUT)的简写,和PostMapping作用等同,都是用来向服务器提交信息。如果是添加信息,倾向于用@PostMapping,如果是更新信息,倾向于用@PutMapping。两者差别不是很明显。
- @DeleteMapping:@RequestMapping(method = RequestMethod.DELETE)的简写,用于处理请求方法的DELETE类型
- @PathVariable : 通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:URL 中的 {xxx} 占位符可以通过@PathVariable(“xxx“) 绑定到操作方法的入参中。
注意:@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
@Autowired
@Qualifier("person")
private Person person;
Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource(name="person")
private Person person;
Service层相关注解
- @service:用于标注业务层组件
Dao层相关注解
- @Repository:可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常
四、SpringBoot配置
SpringBoot自动配置原理
SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @ConfigurationProperties 等几个注解来进行自动配置完成的。
Spring Boot启动的时候首先加载主配置类,@EnableAutoConfiguration 开启自动配置,主要作用就是利用EnableAutoConfigurationImportSelector给容器中导入一些组件,将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中;
@Conditional 条件注解,通过判断类路径下有没有相应配置的 jar 包来确定是否加载和自动配置这个类。
@EnableConfigurationProperties 的作用就是,给自动配置提供具体的配置参数,只需要写在 application.properties 中,就可以通过映射写入配置类的 POJO 属性中。
Spring Boot 配置加载顺序
在 Spring Boot 里面,可以使用以下几种方式来加载配置。
1)properties文件;
2)YAML文件;
3)系统环境变量;
4)命令行参数;
SpringBoot内部配置文件加载顺序
如果在不同的目录中存在多个配置文件,它的读取顺序是:
1、config/application.properties(项目根目录中config目录下)
2、config/application.yml
3、application.properties(项目根目录下)
4、application.yml
5、resources/config/application.properties(项目resources目录中config目录下)
6、resources/config/application.yml
7、resources/application.properties(项目的resources目录下)
8、resources/application.yml
Spring Boot 处理跨域问题
什么是跨域?
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。
狭义上的跨域是指当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。
SpringBoot跨域解决方案
方案一:使用@CrossOrigin注解
在Controller上使用@CrossOrigin注解,该类下的所有接口都可以通过跨域访问,如:
@CrossOrigin("www.baidu.com") // 只有指定域名可以访问该类下所有接口
public class CorsTestController {}
方案二:CORS全局配置-实现WebMvcConfigurer
新建跨域配置类:
/**
* 跨域配置
*/
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Bean
public WebMvcConfigurer corsConfigurer()
{
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").
allowedOrigins("www.baidu.com"). //允许跨域的域名,可以用*表示允许任何域名使用
allowedMethods("*"). //允许任何方法(post、get等)
allowedHeaders("*"). //允许任何请求头
allowCredentials(true). //带上cookie信息
exposedHeaders(HttpHeaders.SET_COOKIE).maxAge(3600L); //maxAge(3600)表明在3600秒内,不需要再发送预检验请求,可以缓存该结果
}
};
}
}
方案二:自定义拦截器实现
通过实现Fiter接口在请求中添加一些Header来解决跨域的问题:
@Component
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletResponse res = (HttpServletResponse) response;
res.addHeader("Access-Control-Allow-Credentials", "true");
res.addHeader("Access-Control-Allow-Origin", "*");
res.addHeader("Access-Control-Allow-Methods", "GET, POST, DELETE, PUT");
res.addHeader("Access-Control-Allow-Headers", "Content-Type,X-CAF-Authorization-Token,sessionToken,X-TOKEN");
if (((HttpServletRequest) request).getMethod().equals("OPTIONS")) {
response.getWriter().println("ok");
return;
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}