SpringBoot(三)

简介: SpringBoot(三)

SpringBoot打包部署

将项目打成jar包

导入依赖:

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

使用maven package代码打包就可以

fa633ddd4e5041bba50cc3288cb728c7.png

项目打成war包

排除项目中自带的所有的Tomcat插件和jsp servlet 依赖,因为这里要将项目放到一个Tomcat上运行

  <!--配置SpringBoot的web启动器-->
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
      <!--排除web启动中自动依赖的tomcat插件-->
      <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter-tomcat</artifactId>
          </exclusion>
      </exclusions>
</dependency>
  <!--
    手动依赖tomcat插件,但是表明项目打包时该依赖不会被打进去,目的主要是保证开发阶段本地SpringBoot
      项目可以正常运行
  -->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
    <!--打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。
        相当于compile,但是打包阶段做了exclude操作-->
   <scope>provided</scope>
  </dependency>

SpringBoot的启动类继承SpringBootServletInitializer,并重写configure

@SpringBootApplication
public class Springboot04Application extends SpringBootServletInitializer {
    //重写配置方法
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(Springboot04Application.class);
    }
    public static void main(String[] args) {
        SpringApplication.run(Springboot04Application.class, args);
    }
}

使用install命令打包项目,并将war包放到tomcat下的webapps下,启动tomcat即可。

SpringBoot拦截器配置

自定义拦截器类:

@Component
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return HandlerInterceptor.super.preHandle(request, response, handler);
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

拦截器配置:

@Configuration
public class MyInterceptorConfig implements WebMvcConfigurer {
    @Autowired
    MyInterceptor myInterceptor;
    //设置拦截器路径
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistration interceptorRegistration = registry.addInterceptor(myInterceptor);
        interceptorRegistration.addPathPatterns("/**").excludePathPatterns("/login");
    }
}

SpringBoot其他注解

@Configuration

用来编写配置类,里面有一些bean实例,spring容器从配置类中来获取这些实例。

配置类:

@Configuration
public class MyConfig {
    @Bean // 向容器中添加一个Bean,以方法名作为Bean的id,返回值类型作为组件的类型
    public User user1(){
        return new User("张三","123");
    }
}

启动类:

@SpringBootApplication
public class Springboot04Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext Context = SpringApplication.run(Springboot04Application.class, args);
        User user1=Context.getBean("user1",User.class);
        System.out.println(user1);
    }
}

@Import

@Import(User.class)
@Configuration
public class MyConfig {
    @Bean // 向容器中添加一个Bean,以方法名作为Bean的id,返回值类型作为组件的类型
    public User user1(){
        return new User("张三","123");
    }
}

根据类型来获取bean实例,默认使用无参构造方法来创建实例对象。

@ImportResource

原生配置文件引入,允许我们自己定义xml配置文件,在文件中配置bean


@ImportResource("classpath:beans.xml")
@Configuration
public class MyConfig {
    @Bean // 向容器中添加一个Bean,以方法名作为Bean的id,返回值类型作为组件的类型
    public User user1(){
        return new User("张三","123");
    }
}

@ConfigurationProperties

读取application.properties配置文件中的内容,读取进入bean

JUnit5

JUnit5常见注解

class Springboot04ApplicationTests {
    @DisplayName("测试方法1:")//是对类的描述
    @Test  //方法可以独立的运行,不需要再测试了
    public void test1(){
    }
    @BeforeAll
    public void beforeAll(){
        System.out.println("在所有的测试方法执行之前先执行一次");
    }
    @BeforeEach
    public void beforeEach(){
        System.out.println("在每一个测试方法之前执行该方法");
    }
    @AfterEach
    public void afterEach(){
       System.out.println("在每一个测试方法之后执行该方法");
    }
    @AfterAll
    public void afterAll(){
        System.out.println("在所有方法执行之后执行该方法");
    }
    @RepeatedTest(3)
    public void repeatTest(){
        System.out.println("重复测试3次");
    }
}

JUnit5断言

@DisplayName("JUnit5断言")
@SpringBootTest(classes = Springboot04ApplicationTests2.class)//在测试的时候可以导入spring中的一些组件
class Springboot04ApplicationTests2 {
    @DisplayName("简单断言1")
    @Test
  public void testAssertions1(){
      int x=add(1,2);
      Assertions.assertEquals(2,x,"add运算结果错误");
  }
  public int add(int a,int b){
        return a+b;
  }
  @DisplayName("组合断言")
  @Test
  public void testAssertAll(){
        Assertions.assertAll("AssertAll",
                ()->Assertions.assertTrue(1>0),
                ()->Assertions.assertTrue(2>3));
  }
    @DisplayName("异常断言")
    @Test//断言它会出现指定的异常,如果没出现,则表示测试失败
    public void testAssertExcepion(){
       Assertions.assertThrows(ArithmeticException.class,()->{int i=1/0;},"竟然没有出现异常");
    }
    @DisplayName("超时异常")
    @Test
    public void testAssertTimeOut(){
        Assertions.assertTimeout(Duration.ofMillis(1000),()->Thread.sleep(900));
    }
    @DisplayName("快速失败")
    @Test //如果测试时出现了某些情况,直接生成测试失败的报告,后续也不再测试了
    public void testFail(){
        Assertions.fail("测试失败");
    }
}

JUnit5前置条件

@DisplayName("JUnit5前置条件")
@SpringBootTest(classes = Springboot04ApplicationTests3.class)//在测试的时候可以导入spring中的一些组件
class Springboot04ApplicationTests3 {
    @DisplayName("测试前置条件")
    @Test
  public void testAssumptions(){
      //假设的条件为true的时候才会执行测试,否则取消测试
      Assumptions.assumeTrue(true);
      System.out.println("测试了");
  }
}

JUnit5嵌套测试

@DisplayName("JUnit5嵌套测试")
@SpringBootTest(classes = Springboot04ApplicationTests4.class)//在测试的时候可以导入spring中的一些组件
class Springboot04ApplicationTests4 {
   @BeforeEach
    public void outerBeforEach(){
       System.out.println("outerBeforeEach");
    }
   @Test
    public void outerTest1(){
       System.out.println("outerTest");
   }
   @Nested
   @DisplayName("内部嵌套测试")
   class InnerClass{
       @BeforeEach
       public void outerBeforEach(){
           System.out.println("innerBeforeEach");
       }
       @Test
       public void outerTest1(){
           System.out.println("innerTest");
       }
   }
}
相关文章
|
11月前
|
敏捷开发 监控 数据可视化
干货:18种项目管理可视化图表是什么?怎么用?
项目管理的核心之一是高效的沟通和信息传递。
749 0
干货:18种项目管理可视化图表是什么?怎么用?
|
自然语言处理 大数据 测试技术
PAIRDISTILL: 用于密集检索的成对相关性蒸馏方法
在大数据时代,有效的信息检索技术对于从海量数据中提取相关信息至关重要。国立台湾大学的研究者提出了一种名为PAIRDISTILL的新方法,通过成对相关性蒸馏,利用成对重排序器提供的细粒度训练信号,显著提升了密集检索模型的性能。该方法不仅在MS MARCO等基准测试中表现出色,还在领域外和零样本场景中展现出强大的泛化能力,为密集检索领域提供了新的研究方向。
341 13
PAIRDISTILL: 用于密集检索的成对相关性蒸馏方法
|
JSON 前端开发 API
使用Python和Flask构建简易Web API
使用Python和Flask构建简易Web API
684 86
|
安全 搜索推荐 Unix
【C语言】《回调函数》详细解析
回调函数是指一个通过函数指针调用的函数。它允许将一个函数作为参数传递给另一个函数,并在特定事件发生时执行。这种技术使得编程更加灵活,可以动态决定在何时调用哪个函数。
769 1
|
机器学习/深度学习 存储 分布式计算
langchain 入门指南 - LangChainRetrieval
langchain 入门指南 - LangChainRetrieval
618 0
|
计算机视觉
开源视频版GPT-4o?快速记忆,实时问答,拿下CVPR'24长视频问答竞赛冠军
【7月更文挑战第19天】Flash-VStream,一款类似GPT的开源视频模型,在CVPR&#39;24赢得长视频问答冠军。该模型模拟人类记忆,实现实时视频流理解和快速问答,降低推理延迟和显存使用,同时推出VStream-QA基准,推动在线视频理解研究。尽管取得突破,但面临记忆限制和计算资源需求的挑战,且新基准的全面性有待检验。[论文链接](https://arxiv.org/abs/2406.08085)
216 11
[NISACTF 2022]bilala的二维码
[NISACTF 2022]bilala的二维码
166 0
获取Grafana安装包并安装
获取Grafana安装包并安装
402 1
|
数据采集 大数据 数据挖掘
企业级数据治理工作怎么开展?Datahub这样做
企业级数据治理工作怎么开展?Datahub这样做
337 0
|
人工智能 JSON JavaScript
使用 LangChain 和 Node.js 提取数据
在本篇文章中,将分享如何使用 LangChain(一个用于构建 AI 驱动应用程序的框架)通过 GPT 和 Node.js 提取和生成结构化 JSON 数据
874 0