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 {
    
    
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37765808/article/details/114445545