Springboot
1.SpringBoot 是什么?为什么我们选择使 SpringBoot 开发
Spring Boot 被称为搭建程序的脚手架。其最主要作用就是帮我们快速的64构建庞大的 spring 项目,并且尽可能的减少一切 xml 配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。 传统的 Java 语言开发一直被人认为是臃肿和麻烦的,主要原因是:复杂的配置和一个混乱的的依赖管理。而 Spring Boot 简化了基于 Spring 的应用开发,只需要“run”就能创建一个独立的、生产级别的 Spring 应用。Spring Boot 为 Spring 平台及第三方库提供开箱即用的设置(提供默认设置,存放默认配置的包就是启动器 starter),这样我们就可以简单的开始。多数 Spring Boot 应用只需要很少的 Spring 配置。
2.SpringBoot 自动配置的原理
1.@EnableAutoConfiguration 这个注释告诉 SpringBoot“猜”你将如何想配置 Spring,基于你已经添加 jar 依赖项。如果 spring-boot-starter-web 已经添加 Tomcat 和 Spring MVC,这个注释自动将假设您正在开发一个 web 应用程序并添加相应的 spring 设置。会自动去 maven 中读取每个 starter 中的spring.factories 文件 该文件里配置了所有需要被创建 spring 容器中的 bean.使用@SpringBootApplication 注解 可以解决根类或者配置类(我自己的 说法,就是 main 所在类)头上注解过多的问题,一个@SpringBootApplication 相当于@Configuration,@EnableAutoConfiguration 和@ComponentScan 并具有他们的默认属性值
3.springboot 常见的注解
@Configuration 把一个类作为一个 IoC 容器,它的某个方法头上如果注册了
@Bean,就会作为这个 Spring 容器中的 Bean。
@Scope 注解 作用域
@Lazy(true) 表示延迟初始化
@Service 用于标注业务层组件.@Controller 用于标注控制层组件(如 struts 中的 action)
@Repository 用于标注数据访问组件,即 DAO 组件。
@Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Scope 用于指定 scope 作用域的(用在类上)
@PostConstruct 用于指定初始化方法(用在方法上)
@PreDestory 用于指定销毁方法(用在方法上)
@Resource 默认按名称装配,当找不到与名称匹配的 bean 才会按类型装配。
@DependsOn:定义 Bean 初始化及销毁时的顺序
@Primary:自动装配时当出现多个 Bean 候选者时,被注解为@Primary 的 Bean将作为首选者,否则将抛出异常
@Resource 默认按名称装配,当找不到与名称匹配的 bean 才会按类型装配。
@Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合
@Qualifier 注解一起使用。如下:@Autowired@Qualifier(“personDaoBean”)存在多个实例配合使用
@ImportResource 注解导入老 Spring 项目配置文件。
4.Spring Boot 中如何解决跨域问题 ?
跨域可以在前端通过 JSONP 来解决,但是 JSONP 只可以发送 GET 请求,无法发送其他类型的请求,在 RESTful 风格的应用中,就显得非常鸡肋,因此我们推荐在后端通过 (CORS,Cross-origin resource sharing) 来解决跨域问题。这种解决方案并非 Spring Boot 特有的,在传统的 SSM 框架中,就可以通过 CORS 来解决跨域问题,只不过之前我们是在 XML 文件中配置 CORS ,现在可以通过实现WebMvcConfigurer接口然后重写addCorsMappings方法解决跨域问题。
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
}
项目中前后端分离部署,所以需要解决跨域的问题。
我们使用cookie存放用户登录的信息,在spring拦截器进行权限控制,当权限不符合时,直接返回给用户固定的json结果。
当用户登录以后,正常使用;当用户退出登录状态时或者token过期时,由于拦截器和跨域的顺序有问题,出现了跨域的现象。
我们知道一个http请求,先走filter,到达servlet后才进行拦截器的处理,如果我们把cors放在filter里,就可以优先于权限拦截器执行。
@Configuration
public class CorsConfig {
@Bean
public CorsFilter corsFilter() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource();
urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration);
return new CorsFilter(urlBasedCorsConfigurationSource);
}
}