SpringBoot根底入门2_Day02笔记

XML的语法规定

  1. 所有XML 元素都须有敞开标签
  2. XML 标签对大小写敏感
  3. 在XML 中,所有元素都必须彼此正确地嵌套。
  4. XML 文档必须要有根元素
  5. XML 的属性值须加引号
  6. 空格会保留,不想html会删除

JVM参数--跟踪类加载

run Configerations-->>Arguments -->>VM arguments
输出:-XX:+TraceClassLoading
下面的框对应的就是main办法里穿的String数组args

  • main办法里的args是JVM调用传入的,和Spring无关

敞开Spring Banner 画面

con
spring.main.banner-mode=off

CommandLiner接口

CommandLineRunner 接口的 Component 会在所有 Spring Beans 都初始化之后,SpringApplication.run() 之前执行
适宜初始化,
执行程序总结
1.先加载Component >> 2.再执行接口里的run办法 >> 最初再执行main办法或者是Test办法

@Autowired注解

主动为该属性注入一个值
前提是该属性所属的类是归于spring框架来治理,@Component/@Service
/@Controller/等等
(打印该属性,调用该属性所属类的toString办法)

我的项目启动过程

找到我的项目的入口类(应用了@SpringBootApplication注解形容),而后运行启动类,检测启动过程,SpringBoot在启动时,控制台会呈现Spring标识

我的项目启动时产生了什么呢?

  1. 首先基于启动入口类上的注解形容,进行主动配置并扫描指定包以及子包中的类进行加载,
  2. 而后检测类上是否有Spring框架中指定的注解形容(例如@Component,@Controller,@Service等)。
  3. 如果有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创立Bean的实例,假如此Bean指定了生命周期办法,还会调用生命周期办法。
  4. 当实例创立当前,Spring框架还会基于类的作用域形容,将实例存储到不同作用域的容器中。以实现Bean对象的迷信利用。

业务初步实现及测试

常见异样1:NoSuchBeanDefinitionException

为什么会有这个异样?先理解一下BeanDefination是什么

  1. Xxx.class是在disk中的
  2. 而后被一个Thread利用I/O技术,读入到JVM内存中
  3. 存在BeanDefinition中,存储的就是这个类的配置信息,包,注解等等等等
  4. 有很多BeanDefinition啊?对的,所以是存储在一个Map中,Map<String,BeanDefinition>,如果没有给@Component("")指定形容,那么String默认为这个bean对应的类名,首字母小写
  5. 由BeanFactory来创立实例(Bean Instance),存储bean的实例信息,也是存在一个Map中,Map<String,Object>,string的和下面的string一样

而NoSuchBeanDefinitionException,这个异样就是没有找到类的配置信息,也就相当于我要一个什么货色,然而连原材料都没有


这个异样很常见,其实没有bean的相干的配置,解决办法:
1.查看注解是不是丢了

常见异样2:No tests found with test runner 'JUNIT5'

解决方案:
1,查看测试方法是不是private,要求不能用private
2,查看单元测试办法是不是void,要求没有返回值
3.查看是不是传了参数,要求不能穿参数

常见异样3:unable to find SpringBootConfiguration

解决方案:
1.查看这个测试类是否在启动类的同一个包或子包中,因为SpringBootApplication还包含SpringBootConfiguration

类与类之间的关系

有三种关系

  • is a (实现/继承)
  • has a (有一个属性)
  • use a (调用了一个办法)

Eclipse关上查找类窗口快捷键
ctrl+shift+T

单例模式,判断两个对象是否是同一个对象?

//因为hashcode办法可能算出一样的值,所以如果打印进去值一样,不靠谱System.out.println(p1);
System.out.println(p2);
//采纳上面这种形式比拟才是真正的比拟对象内存地址
System.out.println(p1==p2);

多例模式

Scope("prototype")
多例对象spring负责创立,不负责销毁
spring启动文件会创立单例对象,然而不会创立多例对象