SpringBoot 根底入门 2_Day02 笔记
XML 的语法规定
- 所有 XML 元素都须有敞开标签
- XML 标签对大小写敏感
- 在 XML 中, 所有元素都必须彼此正确地嵌套。
- XML 文档必须要有根元素
- XML 的属性值须加引号
- 空格会保留, 不想 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 标识
我的项目启动时产生了什么呢?
- 首先基于启动入口类上的注解形容,进行主动配置并扫描指定包以及子包中的类进行加载,
- 而后检测类上是否有 Spring 框架中指定的注解形容(例如 @Component,@Controller,@Service 等)。
- 如果有,则将类交给 Spring 框架中的 BeanFactory 工厂接口的实现类对象,此工厂对象会基于反射创立 Bean 的实例,假如此 Bean 指定了生命周期办法,还会调用生命周期办法。
- 当实例创立当前,Spring 框架还会基于类的作用域形容,将实例存储到不同作用域的容器中。以实现 Bean 对象的迷信利用。
业务初步实现及测试
常见异样 1:NoSuchBeanDefinitionException
为什么会有这个异样? 先理解一下 BeanDefination 是什么
- Xxx.class 是在 disk 中的
- 而后被一个 Thread 利用 I / O 技术, 读入到 JVM 内存中
- 存在 BeanDefinition 中, 存储的就是这个类的配置信息, 包, 注解等等等等
- 有很多 BeanDefinition 啊? 对的, 所以是存储在一个 Map 中,Map<String,BeanDefinition>, 如果没有给 @Component(“”)指定形容, 那么 String 默认为这个 bean 对应的类名, 首字母小写
- 由 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 启动文件会创立单例对象, 然而不会创立多例对象