写点什么

springboot

作者:想要飞的猪
  • 2023-12-01
    广东
  • 本文字数:1935 字

    阅读完需:约 6 分钟

一、为什么 SpringBoot 的 jar 包可以直接使用 java -jar 启动?

1、maven-plugs 插件会把项目打包成为一个 fat jar (jar 中包含 jar,包含了应用的 jar 以及依赖的 jar),的可执行包 2、jvm 规范中规定 java -jar 命令会去找 jar 包中的 manifest.mf 的文件,文件中包含了启动类,以及项目开始类的类路径等等, 3、启动类类中会创建一个自定义的类加载器 LannchedURLClassLoader,会去加载依赖的 jar,以及使用一个子线程去启动项目开始类。

二、跨域请求解决方法

跨越存在的原因:浏览器的同源策略导致,所以只有在浏览器才有跨越问题,后端不存在。1、使用 JSONP 的方式 优点:没有兼容性问题,很多浏览器都支持,缺点:前后端都需要改动,耦合比较大


    //实现方式:    前段Ajax请求时参数添加添加 dataType:"jsonp"    后端接口,增加一个callBack参数接受:并且在 返回一个 JSONPObject(callBack,result)对象,第一个参数为传过来的参数,第二个参数才是真正的返回的数据
复制代码


2、使用 @CrossOrigin 注解,可以加在类或者方法上 3、使用实现接口


public class WebCross implements WebMvcConfigurer {      @Override      public void addCorsMappings(CorsRegistry registry) {          registry.addMapping("/cros")                  .allowedOriginPatterns("http://localhost")                  .allowedMethods("GET","POST");      }  }
复制代码


4、使用配置类


@Configuration  public class MyCrosConfig {      @Bean      public CorsFilter corsFilter(){          CorsConfiguration configuration = new CorsConfiguration();          configuration.addAllowedOrigin("*");          configuration.addAllowedMethod("GET");            UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();          configurationSource.registerCorsConfiguration("**",configuration);            return new CorsFilter(configurationSource);      }  }
复制代码


使用 cors 方式(2,3,4):只需后端修改,前段不用修改,但是对需要浏览器支持,在浏览器发起跨越请求时可能会发起两次请求,第一次是确定后端是否允许跨域请求,第二次才是真正的请求。


5、使用 Nginx 反向代理(推荐使用) 在 ng 的 server 中配置一个 location,根据规则进行反向代理到对应的服务器去。

三、获取配置文件方法

  1. 根据在类属性上添加 @Vaule 注解实现

  2. 根据 @ConfigurationProperties(prefix = "xx") 注解根据类属性与配置项进行配置获取

  3. 根据 Environment 获取 evn。getProperty("xx"),或者实现接口 EnvironmentAware ,重现里面的方法进行实现。

  4. 外部文件时可以使用 @PropertySource() 来制定文件,然后根据 @Vaule 来获取

  5. 外部文件为 yml 文件时需要配置一个 config![[Pasted image 20231114112316.png]]

  6. 还有一种就是直接使用文件流 ,inputStream 来读取配置文件


配置文件优先级 1、命令行参数 java -jar --server.port = 80802、java 系统属性 如启动时的 -Dserver.port = 80813、环境变量:如 在 linux 系统中可以 使用 export server.port = 80824、配置文件(spring 支持多种配置文件 application.properties,application.yml)与文件位置有关,优先级为: 1)、jar 包同级目录下的 config :/config/ 2)、jar 相对路径下 config 中的多层级包:/config/redis/ 3)、当前 jar 包相对路径下:/ 4)、classpatph:config 5)、classpath:优先级由上到下,高优先级会覆盖低优先级,所有文件互补

四、tomcat 启动原理

**外部tomcat**:利用SPI机制进行扩展,用自动配置的方式启动,在SpringBootServletInitalizer中启动对应的应用启动类        1、如果有内嵌的tomcat 则需要先排除掉;        2、打包方式改为war ,需要打成war包;        3、实现接口 SpringBootServletInitalizer 重现里面的方法,把启动类class传递过去。
复制代码


内嵌 tomcat

1、在 refres 方法中的 onRefresh 中 获取 自动配置好的一个 TomcatServletWebServerFactory 对象, 2、根据获取到的额 工程创建 tomcat 对象,启动 tomcat(会新建一个 tomcat 对象),并且挂起等待请求。

五、SpringBoot 核心注解

主要区分 Spring3 已有的注解和 Springboot 新加的注解: SpringBoot 特有的核心注解有: 1、@SpringBootApplication 表示这是一个 Springboot 的工程,其实它是一个复合注解: 2、@SpringBootConfiguration 表示启动类是一个配置类 3、@EnableAutoConfiguration 向 Springboot 中导入一个 Selector,用来加载 classpath 下面的 spring.factories 中配置的类,,将这些类装载为 bean 4、@Conditional,可以定制开发,有很多 ConditionalOnClass、ConditionalOnBean 等等


用户头像

还未添加个人签名 2020-06-05 加入

还未添加个人简介

评论

发布
暂无评论
springboot_想要飞的猪_InfoQ写作社区