SpringBoot学习记录(一)

	因为有需要使用到SpringBoot+Mybatis完成一些项目。也是从零开始学习了一下。先记录一些知识,后期会更新一个完整的SpringBoot框架整合Activiti5的使用流程。希望大家互相学习,多多指导。

SpringBoot——Mybatis
SpringBoot的优点
|-- 快速创建独立运行的Spring项目以及与主流框架集成
|-- 使用嵌入式的Servlet容器,应用无需打成WAR包
|-- starters 自动依赖于版本控制
|-- 大量的自动配置,简化开发,也可修改默认值
|-- 无需配置XML,无代码生成,开箱即用
|-- 准生产环境的运行时应用监控
|-- 与云计算的天然集成

Spring Boot的基础结构共三个文件:

  • src/main/java 程序开发以及主程序入口
  • src/main/resources 配置文件
  • src/test/java 测试程序

Springboot建议的目录结果如下:
在这里插入图片描述

1.Application.java建议放到根目录下面,主要做一些框架配置
2.Domain目录主要用于实体(Entity)与数据访问层(Repository)
DAO(Data Access Objects)数据访问层
在这里插入图片描述
DAO设计模式:
DAO设计模式简介:DAO设计模式可以减少代码量,增强程序的可移植性, 提高代码的可读性。
DAO(数据库操作对象)设计模式是JavaEE数据层的操作。主要由六部分组成:
在整个DAO中实际上都是以接口为操作标准的,即:客户端依靠DAO实现的接口进行操作,而服务端要将接口进行具体的实现。
(1)DatabaseConnection数据库连接类:专门负责数据库打开与关闭的类,即连接数据库并获取连接对象。
(2)VO实体类:主要由属性:setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的一条记录,即包含属性和表中字段完全对应的类。
(3)DAO接口:主要定义操作的接口,定义一系列数据库的原子性操作,例如:增加、修改、删除、按ID查询等,即提供了用户所有的方法。
(4)Impl(DAO实现类):DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭,即实现DAO中所有的方法。
(5)Proxy:代理实现类:主要完成数据库的打开和关闭,并且调用真实实现类对象的操作。
(6)Factory(DAO工厂类):通过工厂类取得一个DAO的实例化对象,为程序提供方法,如果要替换DAO实现类,只需要修改该DAO工厂类的方法代码,而不必要修改所有的操作数据库代码。

3.Service 层主要是业务类代码。
4.Controller负责页面访问控制

Log配置
配置输出的地址和输出级别:
logging.path = /user/local/log
logging.level.com.favorites = DEBUG
logging.level.org.springframework.web = INFO
Logging.level.org.hibernate = ERROR
path为本机的log地址,logging.level后面可以根据包路径配置不同资源的log级别

@Bean 注解的属性解析
1.value name
name 和 value 两个属性是相同含义的,在代码中定义了别名。为bean起一个名字,如果默认没有写该属性,那么就使用方法的名称为该bean的名称。
2.autowire
装配方式 有三个选项
Autowire.NO(默认设置)
Autowire.BY_NAME
Autowire.BY_TYPE
指定bean的装配方式,根据名称 和 根据类型 装配,一般不设置,采用默认即可。
3.initMethod
Bean的初始化方法,直接指定方法名称即可,不用带括号

Spring @component 的作用详细介绍
1.@Controller 控制器(注入服务)
2.@Service 服务(注入dao)
3.@Repository (实现dao访问)
4.@Component (把普通的pojo实例化到spring容器中,相当于配置文件中的)
@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。

Java.lang.SuppressWarnings是标准的Annotation之一。可以标注在类、字段、方法、参数、构造方法、以及局部变量上。
作用:告诉编译器忽略指定的警告,不用在编译完成后出现警告信息。

JPA(java Persistence API)是Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关联映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术。JPA是在充分吸收了现有的多种ORM框架的基础上发展而来的,具有易于使用,伸缩性强等优点。

Junit内Assert.assertEquals()的含义
1.assertEquals([String message],Object targey,Object result)
测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)
2.方法:这两个方法以最直接的方式比较数组,如果数组长度相同,且每个对应的元素相同,则两个数组相等,否则不相等,数组为空的情况也作了考虑。

@Autowired 用法详解

  • @Autowired注释,它可以对类成员变量,方法及构造函数进行标注,完成自动装配的工作。通过@Autowired的方法来消除set,get方法。

  • @Autowired的使用原理:其实在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowired、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。

*注意事项:
在使用@Autowired时,首先在容器中查询对应类型的bean
如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据
如果查询结果不止一个,那么@Autowired会根据名称来查找。
如果查询的结果为空,那么就会抛出异常。解决方法时,使用require=false

IOC容器:Ioc - Inversion of Control,即“控制反转”,就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
IoC主要包含了三个准则:
1.高层次的模块不应该依赖于低层次的模块,它们都应该依赖于抽象。
2.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。
3.面向接口编程而不要面向实现编程

Spring的基本框架主要包含六大模块:DAO、ORM、AOP、JEE、WEB、CORE

  • Spring DAO :Spring提供了对JDBC的操作支持:jdbcTemplate模板工具类
  • Spring ORM :Spring可以与ORM框架整合,例如Spring整合Hibernate框架,其中Spring还提供了HibernateDaoSupport工具类,简化了Hibernate的操作。
  • Spring WEB :Spring提供了对Struts、Springmvc的支持,支持WEB开发。与此同时Spring自身也提供了基于MVC的解决方案。
  • Spring AOP :Spring提供面向切面的编程,可以给某一层提供事物管理,例如在Service层添加事物控制。
  • Spring JEE : J2EE开发规范的支持,例如EJB。
  • Spring Core :提供IoC容器对象的创建和处理依赖对象关系
    DI(依赖注入Dependency injection):在容器创建对象后,处理对象的依赖关系。
    依赖注入spring的注入方式:
  • set注入方式
  • 静态工厂注入方式
  • 构造方法注入方式
  • 基于注解的方式

Spring下面向切面编程(AOP)和事务管理配置
AOP就是纵向的编程,如业务1和业务2都需要一个共同的操作,与其往每个业务中都添加相同的代码,不如写一遍代码,让两个业务共同使用这段代码。在日常有订单管理、商品管理、资金管理、库存管理等业务,都会需要类似日志记录、事物控制、权限控制、性能统计、异常处理及事物处理等。AOP把所有共有代码全部抽取出来,放置到某个地方集中管理,然后在具体运行时,再由容器动态织入这些共有代码。

切面(Aspect):其实就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。
通知(Advice):是切面的具体实现,以目标方法为参照点,根据放置的地方不同,可分为前置通知(Before)、后置通知(AfterReturing)、异常通知(AfterThrowing)、最终通知(After)与环绕通知(Around)5种,在实际应用中通常是切面类中的一个方法,具体属于哪类通知,同样是在配置中指定的。
连接点(Joinpoint):就是程序在运行过程中能过插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持方法级的连接点。
切入点(Pointcut): 用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点,这种精准的匹配四由切入点的正则表达式来定义的。
目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP容器的切入。
代理对象(Proxy):即将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。
织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译器、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译器的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。

@SpringBootTest注解底层实际上还是使用了Junit框架

Junit基本注解
@BeforeClass 在所有测试方法前执行一次,一般在其中写上整体初始化的代码
@AfterClass 在所有测试方法后执行一次,一般在其中写上销毁和释放资源的代码
@Before 在每个测试方法前执行,一般用来初始化方法
@After 在每个测试方法后执行,在方法执行完成后要做的事情
@Test(timeout = 1000)测试方法执行超过1000毫秒后算超时,测试将失败。
@Test(expected = Exception.class)测试方法期望得到的异常类,如果方法执行没有抛出指定的异常,则测试失败
@Test编写一般测试用例

SOA是Service Orient Architecture 的简称,中文译为“面向服务的体系框架”,与传统技术相比,SOA从业务着眼,基于标准化的技术手段,以“服务”为基本元素来构建或整合合适于各行业应用需求的信息系统,提高信息系统的开发效率、充分整合和复用IT资源、并使信息系统能灵活快速的响应业务变化需求。
从技术角度来看,SOA对软件开发的影响是深远的一方面SOA在继承传统的面向对象和组件化(构件化)编程思想的同时,更加强调了软件作为商业资产的可服用、可集成能力,其中软件(组件)的开放性和标准化是SOA的基石,它消除了软件(组件)之间的交流和衔接的的障碍,是软件实现“积木式”灵活装配的基础,同时,SOA强调了服务的治理,其实是为了软件(组件)制定了一个价值衡量标准(或服务分割标准),用以界定软件(组件)的服务价值,这是软件(组件)可复用、可按需组装的价值基础。
另一方面,SOA强调了“积木式”编程的统一基础设施环境,包括设计时的服务组装、运行时服务调度、统一的服务通信总线,这些基础设施提供了随需应变的服务组装能力和可伸缩、低耦合、可靠高效、分布式的服务运行环境,这是对组件化(构件化)编程模式的最新发展和完善,SOA是第一个真正完成、系统的阐述和实现组件化(构件化)编程思想的软件架构,是当前软件系统架构的集大成者。
对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化DAO关系数据库中。

什么是POJO,JavaBean?
一个简单的Java类,这个类没有实现/继承任何特殊的Java接口或者类,不遵循任何主要Java模型,约定或者框架的Java对象。

@PathVariable 绑定URI模板变量值
是用来获得请求URL中的动态参数的
用于将请求URL中的模板变量映射到功能处理方法的参数上

什么是MyBatis?
MyBatis也是一个Java持久化框架,它通过XML描述符或Annotation把对象与存储过程或SQL语句关联起来。与JPA这种对象关系映射(ORM)框架不同,MyBatis并没有将Java对象与数据库表关联起来,而是将Java方法与SQL语句关联。Mybatis允许用户充分利用数据库的各种功能,例如存储过程、视图、各种复杂的查询以及某数据库的专有特性。
与JDBC相比,MyBatis简化了查询结果映射:SQL语句在一行代码中就能执行。MyBatis提供了一个映射引擎,生命式的把SQL语句执行结果与对象树映射起来。通过使用一种内建的类XML表达式语言,或者使用Apache Velocity集成的插件,SQL语句可以被动态的生成,这些特性都可以使开发者更方便的使用MyBatis。MyBatis也支持声明式数据缓存,当一条SQL语句被标记为“可缓存”后,首次执行它时,从数据库取得的所有数据会被存储在一段高速缓存中,今后执行这条语句时,就会从高速缓存中读取结果,而不是再次命中数据库。

MyBatis的优势:
1.上手容易,也更加容易掌握。
2.由于自己掌握SQL,因此可以写出更加优质的SQL,提高SQL的执行效率。
3.多表关联查询,MyBatis要灵活一些,也更具备优势。

代理模式:
代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象。这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。
这里使用到编程中的一个思想:不要随便修改别人已经写好的代码或者方法,如果需要修改,可以通过代理的方式来扩展该方法

代理模式的关键点是:代理对象与目标对象。代理对象是目标对象的扩展,并会调用目标对象。

针对框架内嵌的Tomcat,实现自定义配置用法:
1.可以通过application.yml文件实现
2.可以通过代码,实现自定义配置

SpringBoot的优点:
|–快速创建独立运行的Spring项目以及与主流框架集成
|–使用嵌入式的Servlet容器,应用无需打包成WAR包
|–starters自动依赖与版本控制
|–大量的自动配置,简化开发,也可修改默认值
|–无需配置XML,无代码生成,开箱即用
|–准生产环境的运行时应用监控
|–与云计算的天然集成

@RestController注解相当于@ResponseBody+@Controller合在一起使用
具体的区别:
@Controller修饰类,可以根据需要返回各种我们所需的数据(json,ModelAndView)
@RestController修饰类,最后返回结果都会被解析成json字符串,适合所有的方法返回值都是json数据

Yaml语法:
(1)基本语法:
k:(空格)v:表示uodio键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。
属性和值均是大小写敏感。
(2)值的写法
字面量:普通的值(数字、字符串、布尔)
K:V: 字面直接来写
字符串默认不用加上单引号或者双引号:
“”:双引号:不会转义字符串里面的特殊字符:特殊字符会作为 本身想表示的意思表示出来。
Name:“zhangsan \n lisi”:输出zhangsan 换行 lisi
‘’:单引号:会转义特殊字符,特殊字符最终只是一个普通的字 符串数据
Name:‘zhangsan \n lisi’:输出 zhangsan \n lisi
对象、Map(属性和值)(键值对)
K:V:在下一行来写对象的属性和值的关系:注意缩进
对象还是K:V的方式
Friends:
lastName:zhangsan
Age:20
行内写法:
Friends:{lastName:zhangsan,age:18}
数组(List、Set)
用-值表示数组中的一个元素
Pets:

  • cat
  • dog
  • pig
    行内写法:
    Pets: [cat,dog,pig]

@ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
Prefix = “”,配置文件中与中所有属性进行一一对应

SpringBoot整合MyBatis开启驼峰命名法
属性名匹配规则(Relaxed binding)

  • person.firstName :使用标准方式
  • person.first-Name:
  • person.first_name:
  • PERSON_FIRST_NAME:
    *推荐系统属性使用这种写法

@Value获取值和@ConfigurationProperties获取值比较
@ConfigurationProperties @Value
功能 批量注入配置文件中的属性 一个个指定
松散绑定(松散语法,驼峰) 支持 不支持
SpEL 不支持 支持
JSR303数据校验 支持 不支持

配置文件yml还是Propertiestm都能获取到值(选择):
如果说,我们只是在某个业务逻辑中获取一下配置文件中的某项值,使用@Value
如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties。

Properties中写的东西太多,太繁杂,太沉重,可以自己编写*.properties然后使用@PropertySource标签把其加载进来.
@PropertySource(value={“classpath:person.properties”})
@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效。
SpringBoot里面没有Spring的配置文件,我们自己编写的配置文件,也不能
自动识别;想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上。
@ImportResource(locations = {“classpath:beans.xml”})

配置文件的占位符:
RandomValuePropertySource:配置文件中可以使用随机数
r a n d o m . v a l u e {random.value}、 {random.int}、 r a n d o m . l o n g {random.long}、 {random.int(10)}、${random.int[1024,65536]}

属性配置占位符
app.name = MyApp
App.description = ${app.name}is Spring Boot application

  • 可以在配置文件中引用前面配置过的属性(优先级前面配置过的这里都能用)
  • ${app.name:默认值}来指定找不到属性时的默认值
    Profile多环境支持
    1.多Profile文件
    我们在主配置文件编写的时候,文件名可以是 application-{profile}.propertis/yml
    默认使用application.properties的配置
    2.yml支持多文档块方式
    server:
    Port:8081
    spring:
    profiles:
    active:prod

server:
Port:8083
spring:
profiles:
active:dev


server:
Port:8084
spring:
profiles:
active:test


3.激活指定profile
(1)在配置文件中指定 spring.profiles.active = dev
(2)命令行:
Java -jar *.jar --spring.profiles.active = dev
可以直接在测试的时候,配置传入命令行参数
(3)虚拟机参数
-Dspring.profiles.active=dev

Spring Boot 启动会扫描以下位置的application.properties或者application.yml文件作为SpringBoot的默认配置文件

application.properties的优先级更高

SpringBoot会从这四个位置全部加载主配置文件:互补配置:

  • file:./config/
  • file:./
  • classpath:/config/
  • classpath:/
  • 以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容
  • 我们也可以通过配置spring.config.loacation来改变默认配置。

自动配置的原理:
1)SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration

@Conditional派生注解(Sping注解版原生的@Conditional作用)
作用:必须是@Condition指定的条件成立,才给容器中添加组件,配置里面所有的内容才生效。
在这里插入图片描述

SpEL表达式,能够以一种强大和简洁的方式将值装配到bean属性和构造器参数中,在这个过程中所使用的表达式会在运行时计算得到值。特性包括:
1.使用bean的ID来引用bean;
2.使用方法和访问对象的属性;
3.对值进行算术、关系和逻辑运算
4.正则表达式匹配
5.集合操作

SpEL表达式要放到“#{…}”中。例子:
1.字面值:#{1}计算结果是数字1:#{3.14159}=3.14159浮点数;#{9.87E4}=98700科学计数法;#{‘Hello’}=‘Hello’表示String类型;#{false}=false表示Boolean类型
2.#{T(System).currenTimeMillis()}等同于System.currentTimeMillis(),T()表达式会将Java.lang.System视为Java中对应的类型。T()表达式能够访问目标类型的静态方法和常量。
3.#{sgtPeppers.artist}计算ID为sgtPeppers的bean的artist属性,也可以引用方法;
4.#{systemProperties[‘disc.title’]}通过systemProperties对象应用系统属性。如果通过组件扫描创建bean的话,在注入属性和构造参数时,使用@Value注解。

日志门面(日志的抽象层):SLF4J 日志实现:Logback
SpringBoot选用SLF4j和logback;
SpringBoot能自动适配所有的日志,而是底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉。

日志的默认配置:
(1)全局常规设置(格式、路径、级别)
(2)指定日志配置文件位置
(3)切换日志框架
二选一
logging.file logging.path Example Description
(none) (none) 只在控制台输出
指定文件名 (none) my.log 输出日志到my.log文件
(none) 指定目录 /var/log 输出到指定目录的spring.log文件

Loging.path =
#不指定路径在当前目录下生成springboot.log日志
#可以指定完整的路径
#logging.file = G:/springboot.log
#在当前磁盘的跟路径下创建spring文件夹和里面的log文件夹:使用spring.log作为默认文件

#在控制台输出的日志的格式
Logging.pattern.console =%d{yyyy-MM-dd}[%thread]%-5level %logger{50} - %msg%n
#指定文件中日志输出的格式
Logging.pattern.file=%d{yyyy-MM-dd}[%thread]=%-5level == %logger{50}=== %msg%n

日志的输出格式:
%d:表示日期时间
%thread:表示线程名
%-5level:级别从左显示5个字符宽度
%logger{50}:表示logger名字最长50字符,否则按照句点分割
%msg:日志消息
%n:是换行符
在这里插入图片描述
在这里插入图片描述

发布了16 篇原创文章 · 获赞 4 · 访问量 331

猜你喜欢

转载自blog.csdn.net/qq_39197781/article/details/104569276
今日推荐