精华内容
下载资源
问答
  • 2.一个问题:SpringBoot的main函数中能够使用IOC容器中的Bean吗? 可以,但是是run程序之后,通过ApplicationContext获取的,不能是启动中使用注解注入的。 这要搞清楚SpringBoot的启动过程,连Tomcat都是run...

    1.SpringBoot的类加载顺序怎么能知道?
    在Bean的默认构造函数里面使用System.out.println就能知道创建顺序。

    2.一个问题:SpringBoot的main函数中能够使用IOC容器中的Bean吗?
    可以,但不能是通过注解注入的,只能是在run程序之后,通过ApplicationContext获取的。
    这要搞清楚SpringBoot的启动过程,连Tomcat都是在run程序之后创建的,Spring容器更是之后了。
    在启动类中用注解为成员变量注入值,由于先加载成员变量,之后加载静态的main函数,成员变量被加载并默认初始化时,main函数还没运行,Spring框架都还没启动,自然无法处理启动类中的注解。【注意,这与启动类中成员变量是否被static修饰无关,根本原因是启动类中成员变量被创建时,Spring框架还没启动】【另外,成员变量被加载就是被创建吗?从表现上看不是这么回事,因为构造函数中的System.out.println方法没有执行,可见加载只是创建引用变量,默认初始化只是指向默认的null对象,此时并没有创建对象,只有new才会创建对象。注意:JVM加载类并不等于】

    JVM加载类的过程:加载、初始化、实例化,实例化才是调用new构造函数
    https://blog.csdn.net/justloveyou_/article/details/72466416

    public class Test {
        private TestA testA = new TestA();
        private static TestB testB = new TestB();
    
        public static void main(String[] args) {
            System.out.println("Test");
        }
    }
    
    
    class TestA{
        public TestA(){
            System.out.println("TestA");
        }
    }
    
    class TestB{
        public TestB(){
            System.out.println("TestB");
        }
    }
    
    输出:
    TestB
    Test
    
    注意:
    TestA即使被new了,但是并没有创建
    

    另外一点,手动new的对象,其注解都不会起作用,已经与SpringIOC容器无关了。此时再从SpringIOC中取出注解装入的该类实例,可以看到是两个不同的实例
    @Scope修饰为单例也没用,new的时候是直接调用构造函数,与注解无关,注解起作用的时机在SpringIOC容器创建并扫描包的时候。

    与加载顺序相关的注解:
    @DependOn
    @Order

    展开全文
  • 你可能已经知道怎么为你的应用的一个类写单元测试了,所以,该篇博客会专注于使用spring的测试和springboot的功能来测试你的代码和spring之间的关系,你会应用上下文加载成功后开启测试,并继续使用MockMvc来测试web层...

    创建一个简单的springboot应用

    springboot的出现,使得Java开发变得非常简单,它使得你只专注于自己业务逻辑的开发,而和业务无关的例如事务,日志等等,springboot都可以帮你完成

    1.开发环境:

    idea

    Java11

    maven3.5.3

    springboot 2.4.4

    2.创建一个springboot的应用

     2.1 手动创建

              可以在官网下载springboot的压缩包,https://start.spring.io/,添加spring web然后点击generate即可,然后解压即可生成一个springboot项目

    2.2 使用idea创建

            1,点击create new project.

             

     

    2.点击spring initialize , 点击next

    3.配置项目基本信息,这一步选择默认的也可以,配置完成后点击next

    4.添加项目的依赖 , 选择web->spring web,点击next

    5.项目的路径,以及项目名称,点击finish

    6.项目创建完毕.结构如下图,可能你的域名包名和我的不一样, 第一次创建项目可能会比较慢,因为要下载很多jar

     

    7.测试. 在com.example.demo下创建HomeController类,

    HomeController类:

    package com.example.demo;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @Controller
    public class HomeController {
    
        @RequestMapping(value = "/")
        public @ResponseBody String greeting(){
            return "HelloWorld";
        }
    }
    

    8.点击DemoApplication,运行main方法,等几秒钟,项目就会启动成功.

    然后点击  http://localhost:8080,会在网页上显示HelloWorld

     

     

    展开全文
  • 这篇文章主要是告诉我们怎么创建自己的SpringBoot autoconfiguration Auto-configuration classes能被绑定在一个外部jar包并且能被Spring Boot加载。每一个Auto-configuration能够被关联到一个starter,创建步骤(1...

    以前对于SpringBoot的starter机制一直很好奇,为什么我们引入一个开源框架的starter,就可以直接使用了,如何做到的。于是就看了几个starter的源码,探究一下。

    (1)其实对于每个starter里面并没有源码,只是依赖了一个对应的autoconfiguration,这个autoconfiguration的jar包下有一个XxxxxxAutoConfiguration.class,里面配置了框架启动需要自动注入的一些bean(默认优于配置)。所以会自动启动这个XxxxxxAutoConfiguration.class

    (2)在META-INF/spring.factories加上自动装配配置;META-INF/spring-configuration-metadata.json下配置application.properties的key-value的提示项。

    创建步骤

    (1)实现XxxxxxAutoConfiguration.class类,并加上@Conditional限制条件

    这需要实现需要自动装载的bean

    (2)在META-INF/spring.factories里面加上如下:

    # 如果有多个XxxxxAutoConfiguration,用逗号分隔
    org.springframework.boot.autoconfigure.EnableAutoConfiguration=xxx.xxx.xxx.xxx.XxxxxAutoConfiguration

    (3)限制Auto-Configuration的顺序

    使用 @AutoConfigureAfter or @AutoConfigureBefore可以限制XxxxxxAutoConfiguration.class的加载顺序

    (4)创建metadata

    (META-INF/spring-configuration-metadata.json) to make sure your keys are properly documented.
    这里的配置是作用XxxxxxAutoConfiguration需要用到的一些properties的,这些properties我们可以写在application.properties里面,然后通过这个文件的规约给出提示。

    此外我们可以写一个XxxxProperties.java, 然后通过 @ConfigurationProperties 注解,自动装载application.properties的值到XxxxProperties.java中。

    (5)编写startermodule,引入Auto-Configuration这个module

    展开全文
  • 跟了两层以后会发现这个地方使用静态方法创建了一个SpringApplication对象,并调用了它的 run 方法。 那我我们先来看下是怎么创建 SpringApplication对象的吧。 刚才这个静态方法下面又封装了一层,传入了...

    一、启动类 - 新生成一个SpringApplication

    以最简单的启动SpringBoot方式为例,

     

    跟了两层以后会发现在这个地方使用静态方法创建了一个SpringApplication对象,并调用了它的 run 方法。

     

    那我我们先来看下是怎么创建 SpringApplication对象的吧。

    刚才这个静态方法下面又封装了一层,传入了一个null的resourceLoader,这个参数一定程度上可以理解为类加载器,传入为null时实际上最后用到类加载器的是线程的默认的,这个后面用到resourceLoader 的时候会讲。

     

    再下面一层就是实际构造SpringApplication对象的构造器了。

     

    今天我们的目标就是解释一下这个创建过程中每一行在做什么。比较简单的行就直接用注解的方式来说明了。

    public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
       //STEP1:设置 resourceLoader,此处应该为null
       this.resourceLoader = resourceLoader;
       //STEP2:断言,primarySources不能为空
       Assert.notNull(primarySources, "PrimarySources must not be null");
       //STEP3:将 primarySources 进行去重,放到一个成员变量里面保存
       this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
       //STEP4:判断当前应用的类型
       this.webApplicationType = WebApplicationType.deduceFromClasspath();
       //STRP5:配置初始化器
       setInitializers((Collection) 
       getSpringFactoriesInstances(ApplicationContextInitializer.class));
       //STEP6:配置监听器
       setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
       //STEP7:通过栈信息查找执行main方法的主类
       this.mainApplicationClass = deduceMainApplicationClass();
    }

     

    STEP1、2相对简单,这里就不多介绍了。STEP7可以跟一层源码,也很简单。

    STEP4:

    这一步是判断当前应用的类型。可以看到 WebApplicationType 是一个枚举类,主要用于判断当前应用的类型。

     

    我们可以看到在这个枚举类里面定义了三种类型的web应用,第一种NONE代表不是Web项目,第二种就是我们常见的Servlet,第三种是Reactive。STEP4主要想做的就是判断当前的Web应用到底属于哪种类型。那么用什么方式来判断呢?我们可以从STEP4中的 WebApplicationType.deduceFromClasspath() 方法来看看

     

    我们可以看到,这个方法判断web应用的策略就是:通过classLoader取找指定的类,再根据这个类查找的结果,来判断web应用的类型。

    举个例子,我们都知道Servlet的核心类是 javax.servlet.Servlet,那我们仔细想想,反向推理的话,如果你的Web应用的classpath里面不包含这个类的话,是不是就可以断定它不是一个Web应用了?这个地方用的就是这种推理方法,品一品。

     

    STEP5 & STEP6:

    这两个步骤放在一起说,因为他们俩的逻辑都是一样的:从classpath中找到并读取META-INF/spring.factories文件,读取指定的配置后,实例化并设置到本地的成员变量。不同的是他们读取的配置不一样而已。

    你在使用SpringBoot的时候有没有想过为什么我想集成一个Redis这种第三方组件这么简单?pom里面加一个starter,配置文件加几行就可以直接使用了?SpringBoot自动装配做了哪些事情?其实就和spring.factories 这个文件有关。这不是这篇文章讨论的重点,有兴趣的同学可以自己拓展下。

     

    从方法的名字我们可以大概才出来它是干嘛的:读取 spring.factories 文件。

    我们具体来分析这个方法。按照顺序我们分为四行去解析。

     

    第一行:

     

    getClassLoader()方法,获取一个类加载器。这个我们之前说过resourceLoader传的是个null,这里会用到它,我们看下这个方法的源码。

     

    这里很明显了,如果 resourceLoader 不为空的话,那么就将这个对象中的ClassLoader返回。

    我们在前面知道 resourceLoader 是null,所以看下面这个获取默认ClassLoader的逻辑。

     

    可以看到在方法开始的时候就拿了当前线程的ClassLoader并返回,如果当前线程的ClassLoader仍为空的情况下,会返回一个系统默认的ClassLoader。

    这个地方理解的比较浅显,你可以简单地认为,

    getClassLoader() 这个方法无论如何都会返给你一个类加载器。

     

    第二行:

     

    前面有一行注释,说明这个结果是去重过的。

    这个names里面放的是什么东西呢?我的理解是 spring.factories 文件中对应的配置项。

    以STEP5为例,names这个Set里面放的应该是一系列配置Key为 ApplicationContextInitializer.class 全路径名 org.springframework.context.ApplicationContextInitializer 的Value。

     

    上面这段话可能比较难理解,那么我们就来验证下吧。

     

    我们在names这个地方打个断点,看下它的输出是什么?

     

    直接启动SpringBoot就可以到这个断点,我们看到这里面有8个String类型的对象,那么这些对象从哪里来的呢?就是从spring.factories文件中来的。

    下面我们来验证一下。

    我们使用IDEA的全局搜索文件,可以看到有很多spring.factories。

     

    我们选取其中一个,在

     

    这个文件中按照刚才说的Key值 org.springframework.context.ApplicationContextInitializer 来搜索,

     

    发现这几条与刚才断点调试的时候其中几条完全一致,这样我们就简单验证了一点:第二行的作用是从spring.properties文件中读取指定的配置文件。

     

    这篇文章先更新到这里,后面一篇我们一起看下Spring是怎样读取 spring.properties 文件的,另外介绍下新建SpringApplication对象中STEP5&6剩下的部分。

     

    展开全文
  • 使用过springboot的都知道,我们创建一个主启动,然后创建一个main函数,然后SpringApplication.run(Application.class); 我们的程序就启动起来了,至于怎么启动起来的,当前是什么样的环境,我们的tomcat容器...
  • SpringBoot的第一个web项目完整小案例

    万次阅读 2018-01-06 19:55:26
    本文旨在展示第一次使用SpringBoot怎么运行起来一个项目,首先你的idea安装好了, 我们安装好idea之后,就可以创建SpringBoot项目了 1.右击File 2.选择是生成 3.注意选择java版本...7.建立一个类(注意使用Rest
  • 在SpringBoot中,我们可以理解成,一个Controller接口对应多个ServiceImpl,使用这种方式,如果后期需要添加一个功能,仅仅创建一个ServiceImpl就可以满足需求,而不用再额外创建一个Controller接口。现在假设一个...
  • 昨天使用Springboot框架创建一个类,可以本地通过浏览器访问程序的返回内容。今天我们继续往下深入。但是深入前出现了一个小插曲。什么插曲呢,就是按照视频教程,如果通过浏览器访问时添加项目名称,需要 ...
  • --我觉得不应该是多例,太浪费资源了,能否按照实现组合创建多个单例(实际就是多例,但不是一个请求创建一个,而是一种组合创建一个)呢?嗯,我觉得这种思路对,但不知从何下手!spring支持这种根据组合的多实例...
  • 同步情况下首先新建一个Service: 之后新建一个Controller来调用此方法: 之后启动服务, 由于service会等待三秒,所以调用hello方法时会等待三秒才能返回success. 重点来了: 为了不等待,直接...
  • 前几天我们学会了如何创建springboot项目今天我们说一下他...首先我们看一下这个注解,他是用来标注主程序的,表明他是一个springboot项目 @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME...
  • 当项目中引入了web依赖后,会META-INF目录的spring.factories文件中保存...该中有一个DispatcherServlet 静态内部,通过静态内部中的dispatcherServlet()方法,创建一个DispatcherServlet使用@Bean注解注.
  • 遂自作聪明给建了一个application的包装着启动。结果代码写好了,怎么调试也是404。 解决关键:SpringBoot 注解 @SpringBootApplication 默认扫描当前的同包以及子包下的。 解决方案:source root文件夹下...
  • 当自己写的Controller所在的包和启动一个包下时,需要怎么做呢, 启动上加上一个注解,@ComponentScan(basePackages = {“包名”}), 没加的话,可能会出现如下问题 IDEA中启动成功,但是访问自己写的...
  • 根据实体自动创建数据库表格 配置文件中添加这个 启动项目创建完之后你会发现数据库字段和实体不一样 是...本项目中创建一个和源码一样的包结构 然后创建一个和源码一样的类名,把所有源码中的所有代码...
  • 默认的application启动,在创建项目时自动生成application启动,直接run执行即可。 方式二:使用外置的tomcat启动 默认的启动要继承SpringBootServletInitiailzer,并复写configure()方法。 ...
  • 我正在开发一个简单的Spring Boot基础休息应用程序,它已部署到带有jndi数据源的外部tomcat服务器中 . 当我运行应用程序时,数据库被创建,这意味着应用程序能够读取实体创建hibernate ddl . 但是,当我尝试从...
  • 首先创建一个SpringBoot项目 导入实体 我们再resources文件夹下创建静态资源文件 并导入几个页面。 我们可以看到public文件夹下和templates文件夹下都有index.html 我们启动服务: 可以看到访问的是public...
  • 拦截器的作用拦截器提供了种机制,访问action前后进行一些操作,因为拦截器的这特性,那么我们就可以利用拦截器做一些事情,比如监控访问人数,拦截一些非法请求,记录访问日志,身份验证之的构建拦截器2.1 ...
  • springboot全局异常处理

    2019-11-14 10:35:57
    优雅的全局异常处理 首先搭建好springboot项目 springboot项目怎么搭建 这里就忽略了,既然你都怎么处理springboot项目的全局异常,那说明你肯定有一个springboot项目 首先亮一下我的...1,创建一个基础...
  • 该篇博客会让你创建一个简单的spring应用并且使用Junit来测试它,怎么创建spring应用参考我创建一个简答你的springboot应用并且运行,您可能已经知道如何应用程序中编写和运行单个的单元测试,因此,对于本博客,...
  • Springboot在启动过程中会自动识别当前是否是web环境,如果是web环境就会创建web对应ApplicationContext,进而内部启动一个web容器(tomcat/jetty)。这一切都不需要用户做什么配置,这是怎么做到的呢?简单说来...
  • 基于springboot的junit单元测试

    千次阅读 2020-02-17 12:21:30
    首先就是要有一个springboot项目,具体怎么创建就不过多赘述,不懂的小伙伴自行查找资料。 创建好springboot项目后,添加单元测试需要的依赖,这是我项目的依赖 导入jar包后就可以对要测试的进行快速测试,右击想...
  • springboot打war包

    2019-06-26 11:44:26
    记录springboot的war包的记录。 新建项目的时候传采用的是jar包,后来准备上限部署,pom.xml里面添加 <packaging>war</packaging>...//启动同级目录下创建,继承Spr...
  • 文章目录前言一、添加依赖二、创建两个工具2.1、新建一个基于面向切面的2.2、新建分页的工具三、业务逻辑层(Service)调用分页工具3.1、业务逻辑层3.2、业务逻辑层实现四、Junit测试总结 前言 最近有...
  • 上篇文章我们讲到了怎么对数据的查询操作,每次查询数据都会返回中构建一个匿名去封装返回结果,这样的话导致我们有大量的冗余代码,这并不是我们想要的结果,这篇文章主要讲解一下对数据结果的封装,也就是自定义...
  • 我们创建过大大小小很多个springboot框架的项目,我们创建一个Maven工程之后,需要完成关键的三步,就可以启动项目了 1、引入依赖 我们知道springboot框架的优点主要有两点: 解决复杂的配置问题; 解决混乱的...
  • .jar.original是上一次打包的备份文件您还应该target目录中看到一个更小的文件xxx-0.0.1-SNAPSHOT.jar.original。这是MavenSpring Boot重新打包之前创建的原始jar文件。可以用jar tvf target/xxx-0.0.1-SNAPSHOT...
  •  前后端分离项目建议不要存储session中,存储redis中,redis存储需要一个key,key一同返回给前端用于验证输入: @Controller public class CaptchaController { @Autowired private RedisUtil redisUtil; ...
  • 怎么通过SpringBoot创建WebSocket服务的文章很多, 类似于单点登录,一个账号只能在一个地方登录,我们的长连接也经常会需要限制一个用户只能保持一个长连接 这里就讲一下实现单点连接的一种思路 /** * ...

空空如也

空空如也

1 2 3 4
收藏数 67
精华内容 26
关键字:

在springboot怎么创建一个类

spring 订阅