1.JDK新特性
record 记录类
Swich 开关表达式 支持箭头表达式 ,yied 返回值 ,Java Record
Text Block 文本块
Var 声明局部变量
sealed 密封类
2 Springboot基础
2.1概要
Spring Boot 是目前流行的微服务框架 倡导 约定优先于配置” 其设 目的是 用来简化新 Spring 应用的初
始化搭建以及开发过程。 Spring Boot 提供了很多核心的功 能,比如自动化配置 starter(启动器) 简化 Maven
配置、内嵌 Servlet 容器、应用监控等功能, 让我们可以快速构建企业级应用程序。
与spring的关系
首先明确一点,Spring Boot 和 Spring Framework 都是创建的 Spring 应用程序。Spring Boot 是一个新的框架,
看做是 Spring 框架的扩展,它消除了设置 Spring 应用程序所需的 XML 配置,为更快,更高效的创建 Spring
应用提供了基础平台。Spring Boot 能够快速创建基于 Spring ,SpringMVC 的普通应用以及 Web 项目。
与SpringClould的关系
微服务:微服务(Microservices Architecture)是一种架构和组织方法,微服务是指单个小型的但有业务功能的服务,
每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。
SpringClould基于springBoot
2.2springBoot脚手架
脚手架是一种用在建筑领域的辅助工具,是为了保证建筑施工过程顺利进行而搭设的工作平台。软件工程中
的脚手架是用来快速搭建一个小的可用的应用程序的骨架,将开发过程中要用到的工具、环境都配置好,同时生
成必要的模板代码。
2.3结构
±—Application.java 启动类
±—controller 控制器包
—StudentController.java
—ScoreController.java
±—service 业务层包
—inter 业务层接口
—impl 接口实现包
±—repository 持久层包
±—model 模型包
—po 实体类包
—dto 数据传输包
—vo 视图数据包
2.3 starter启动器
starter启动器是一组方便的依赖项描述符,可以在pom中引入其依赖,免去了自己需要引用很多依赖类,并且SpringBoot会自动进行类的自动配置。
2.3 外部化配置
配置文件有两种格式分别:properies 和 yaml(yml)。properties 是 Java 中的常用的一种配置文件格式,
key=value。key 是唯一的,文件扩展名为 properties。
yaml(YAML Ain’t Markup Language)也看做是 yml,是一种做配置文件的数据格式,基本的语法 key:[空格]
值。yml 文件文件扩展名是 yaml 或 yml(常用)。
2.4 application文件
Spring Boot 建议使用一种格式的配置文件,如果 properties 和 yml 都存在。properties 文件优先。推荐使用 yml
文件。
application 配置文件的名称和位置都可以修改。约定名称为 application,位置为 resources 目录。
2.5 Environment
Environment 是外部化的抽象,是多种数据来源的集合。从中可以读取 application 配置文件,环境变量,系统属
性。使用方式在 Bean 中注入 Environment。调用它的 getProperty(key)方法。
2.6组织多文件
application配置文件中,通过spring.config.import 来导入,多个配置文件导入用","分隔
${} 可以读取application中的信息
2.7绑定Bean
@Bean
2.8@ConfigurationProperties 属性绑定
@ConfigurationProperties 能够配置多个简单类型属性,同时支持 Map,List,数组类型。对属性还能验证基本格式。(能够绑定配置文件中的属性)@ConfigurationProperties 声明在类上,表示绑定属性到此类。prefix 表示前缀,是配置文件中多个 key 的公共前缀。
也可以嵌套Bean.
如果某个类需要在配置文件中提供数据,但是没有源代码。此时**@ConfigurationProperties 结合@Bean** 一起在方法上面使用。
Map,List 以及 Array 都能提供配置数据,但是对象名称应该和prefix前缀相等,比如
@ConfigurationProperties
public class CollectionConfig {
private List servers;
private Map<String,User> users;
private String [] names;}
2.9 注解扫描
@ConfigurationProperties 注解起作用,还需要**@EnableConfigurationProperties** 或**@ConfigurationPropertiesScan**。这
个注解是专门寻找@ConfigurationProperties 注解的,将他的对象注入到 Spring 容器。在启动类上使用扫描注解。里面加包名
2.10 加载配置文件
application 做配置是经常使用的,除以以外我们能够指定某个文件作为数据来源。@PropertySource 是注解,
用以加载指定的 properties 文件。
@PropertySource 与@Configuration 一同使
用,其他注解还有@Value,@ConfigurationProperties
比如一类上有
@Configuration
@ConfigurationProperties(prefix = “group”)
@PropertySource(value = “classpath:/group-info.properties”)
总结@ConfigurationProperties 绑定 Bean 对于使用配置文件的数据是十分方便,灵活的。也支持对数据的校验,
校验是 JSR303 规范中的注解。
Bean 定义结合 Lombok 会更加方便。如果团队都接受 Lombok。 推荐使用。
2.11 创建对象的三种方式
传统的 XML 配置文件
Java Config 技术, @Configuration 与@Bean
创建对象的注解,@Controller ,@Service , @Repository ,@Component
3.A0P
AOP(Aspect Oriented Programming):面向切面编程,保持原有代码不变,能够给原有的业务逻辑增加二维的
功能。AOP 增加的功能是开发人员自己编写的,底层是动态代理实现功能的增强。对于扩展功能十分有利。Spring
的事务功能就是在 AOP 基础上实现的, 业务方法在执行前【开启事务】,在执行业务方法,最后【提交或回滚
失败】。
3.1切面,连接点,切入点,通知
Aspect:表示切面,开发自己编写功能增强代码的地方,这些代码会通过动态代理加入到原有的业务方法中。
@Aspect 注解表示当前类是切面类。 切面类是一个普通类。
Joinpoint:表示连接点,连接切面和目标对象。或是一个方法名称,一个包名,类名。在这个特定的位置执
行切面中的功能代码。
切入点(Pointcut):其实就是筛选出的连接点。一个类中的所有方法都可以是 JoinPoint, 具体的那个方法要
增加功能,这个方法就是 Pointcut。
Advice:翻译是通知,也叫做增强。表示增强的功能执行时间。 Java 代码执行的单位是方法,方法是业务
逻辑代码,在方法之前增加新的功能,还是方法之后增加功能。 表示在方法前,后等的就是通知。
3.2通知范围注解
@Before:在切点方法之前执行。
@After:在切点方法之后执行
@AfterReturning:切点方法返回后执行
@AfterThrowing:切点方法抛异常执行
@Around:属于环绕增强,能控制切点执行前,执行后。功能最强的注解。
Target Object: 目标对象。 在 A 类的 print()方法执行前, 输出方法的执行时间。 也就是给 A 这个对象增加
了“输出执行时间的功能”。
3.3AOP实现
引入aop依赖
创建service和impl
创建切面类(就是在类上加注解,在方法上写通知和切入点表达式,参数里添加切入点)
@Component
@Aspect
public class LogAspect {
//前置通知 execution 是切入点表达式
@Before("execution(* com.bjpowernode.aop.service..*.*(..))")
public void sysLog(JoinPoint jp){
StringJoiner log = new StringJoiner("|", "{", "}");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
log.add(formatter.format(LocalDateTime.now()));
//目标方法参数列表
Object[] args = jp.getArgs();
for (Object arg : args) {
log.add( arg == null ? "-" : arg.toString());
}
System.out.println("方法执行日志:" + log.toString());
}
}
4. 自动配置(重点)
4.1 概述
启用 autoconfigure(自动配置),框架尝试猜测创建的 Bean和 要使用的 Bean,从类路径中查找 xxx.jar,创建这个 jar中某些需要的 Bean。
例如我们使用 MyBatis 访问数据, 从我们项目的类路径中寻找 mybatis.jar, 进一步创建SqlSessionFactory, 还需要 DataSource 数据源对象,尝试连接数据。这些工作交给 XXXAutoConfiguration 类,这些就是自动配置类。
自动配置的注解@EnableAutoConfiguration(启动类的@SpringBootApplication 注解)所在的包,具有特殊的含义,是 Spring Boot 中的默认包,默认包是扫描包的起点(根包)。@Controller ,@Service, @Repository ,@Component, @Configuration 放在根包以及子包中就会被扫描到。
4.2@EnableAutoConfiguration 分析
@Import:导入类,注册为 Bean。@Import 相当于 xml 文件中的。 可以导入@Configuration 的类,实现了 ImportSelector 接口的类,ImportBeanDefinitionRegistrar 接口的类。
ImportSelector 接口在 Spring Boot 使用的比较多
AutoConfigurationImportSelector是@import的参数,r间接实现了 ImportSelector 接口,导入自动配置类
4.3@AutoConfiguration 注解
新的注解@AutoConfiguration,用在自动配置类的上面。相当于增强的@Configuration,专注自动配置类。
@AutoConfiguration 还支持通过 after、afterNames、before 和 benameames 属性进行自动配置排序,决定多个自动
配置类执行先后顺序。
5.访问数据库
5.1DataSource
DataSource 在 application 配置文件中以 spring.datasource.*作为配置项。类似下面的代码:
spring.datasource.url=jdbc:mysql://localhost/mydb
spring.datasource.username=dbuser
spring.datasource.password=dbpass
5.2JDBCTemplate
脚手架选择MySQL Driver, JDBC API
配置DataSource
注入JdbcTemplate对象,用(@Resource或者其他)
使用…
NamedParameterJdbcTemplate能够接受命名的参数,通过具名的参数提供代码的可读性,JdbcTemplate 使用
的是参数索引的方式。
在使用模板的位置注入 NamedParameterJdbcTemplate 对象,编写 SQL 语句,在 SQL 中 WHERE 部分“:命
名参数”。调用 NamedParameterJdbcTemplate 的诸如 query,queryForObject, execute,update 等时,将参数封装到
Map 中。(增强版的DBCTemplate)
5.3Mybatis
依赖
实体类
mapper接口(注解式)
application开启驼峰等全局设置
application配置数据源
@MapperScan({包}) 加在启动类上
重要的注解:
@Results 用于定义结果映射,每个列和 Java 对象属性的一一对应。
@ResultMap 指定使用哪个结果映射.另一种方法在 xml 中定义标签,在@ResultMap 注解引用。 这种方式首先创建 xml。在 resources 目录下创建自定义的 mapper 目录。
5. 4 SQL提供
我们能在方法上面直接编写 SQL 语句。使用 Text Block 编写长的语句。方法上编写 SQL 显的不够简洁。
MyBatis 提供了 SQL 提供者的功能。将 SQL 以方法的形式定义在单独的类中。 Mapper 接口通过引用 SQL 提供
者中的方法名称,表示要执行的 SQL。
SQL 提供者有四类**@SelectProvider,@InsertProvider,@UpdateProvider,@DeleteProvider。(用于接口方法上)
SQL 提供者首先创建提供者类,自定义的。类中声明静态方法,方法体是 SQL 语句并返回 SQL。
例如:@UpdateProvider(type = SqlProvider.class,method = “updateTime”)**
5.5 @One 一对一查询
关系表一个 article 有一个 article_detail 文章内容
例如
@Result(column = “id”, property = “articleDetail”,
one = @One
(select ="com.bjpowernode.orm.repository.ArticleOneToOneMapper.queryContent",fetchType = FetchType.LAZY))
5.6 @Many 一对多
比如一个班级有很多学生
@Result(column = “id”, property = “comments”,
many = @Many(select =“com.bjpowernode.orm.repository.ArticleOneToManyMapper.queryComments”, fetchType =FetchType.LAZY))
5.7 常用配置
#驼峰命名
mybatis.configuration.map-underscore-to-camel-case=true
#启用缓存
mybatis.configuration.cache-enabled=true
#延迟加载
mybatis.configuration.lazy-loading-enabled=true
5.8 MybatisAutoConfiguration
imports 文件中定义了 org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration 自动配置类
关注:
MybatisProperties.class
DataSourceAutoConfiguration.class , DataSourceProperties.class
SqlSessionFactory.class
SqlSessionTemplate.class
5.9连接池配置
6.声明式事务
Spring 解决了全局和本地事务的缺点。它允许应用程序开发人员在任何环境中使用一致的编程模型。只需编
写一次代码,就可以从不同环境中的不同事务管理策略中获益。Spring 框架同时提供声明式和编程式事务管理。
推荐声明式事务管理。
Spring 事务抽象的关键是事务策略的概念,org.springframework.transaction.PlatformTransactionManager 接口
定义了事务的策略
6.1事务的属性
Propagation : 传播行为。代码可以继续在现有事务中运行(常见情况),也可以暂停现有事务并创建新事务
Isolation: 隔离级别。此事务与其他事务的工作隔离的程度。例如,这个事务能看到其他事务未提交的写吗?
Timeout 超时时间:该事务在超时和被底层事务基础结构自动回滚之前运行的时间。
Read-only **只读状态:**当代码读取但不修改数据时,可以使用只读事务。在某些情况下,例如使用 Hibernate
时,只读事务可能是一种有用的优化。
6.2 AOP对事务的实现
Spring Framework 的声明式事务管理是通过 Spring 面向方面编程(AOP)实现的。事务方面的代码以样板的方式使用,即使不了解AOP 概念,仍然可以有效地使用这些代码。事务使用AOP的环绕通知(TransactionInterceptor).
6.3声明式事务的方式
声明式事务的方式:
XML 配置文件:全局配置
@Transactional 注解驱动 :和代码一起提供,比较直观。和代码的耦合比较高。【Spring 团队建议您只使用@Transactional 注释具体类(以及具体类的方法),而不是注释接口。当然,可以将@Transactional 注解放在接口(或接口方法)上,但这只有在使用基于接口的代理时才能正常工作】
方法的可见性:
公共(public)方法应用@Transactional 注解。如果使用@Transactional 注释了受保护的、私有的或包可见的方法,
则不会引发错误,但注释的方法不会显示配置的事务设置,事务不生效。如果需要受保护的、私有的方法具有事
务考虑使用 AspectJ。而不是基于代理的机制。
使用方式:
service具体方法上加@Transactional注解
启动类上加@EnableTransactionManagement
6.4事务回滚控制
@Transactional 注解的属性控制回滚+异常类
rollbackFor
noRollbackFor
rollbackForClassName
noRollbackForClassName
6.集成javaweb
编写 Spring MVC 的应用分成三步:
- 编写请求页面(在浏览器直接模拟的请求)
- 编写 Controller
- 编写视图页面
6.1 Json视图
上面的例子以 Html 文件作为视图,可以编写复杂的交互的页面,CSS 美化数据。除了带有页面的数据,还
有一种只需要数据的视图。比如手机应用 app,app 的数据来自服务器应用处理结果。
从 Spring6. Spring Boot3 开始 javax 包名称,修改为 jakarta。
添加注解**@ResponseBody**实现返回Json
6.2 添加Favicon
step1:将生成的 favicon.ico 拷贝项目的 resources/ 或 resources/static/ 目录。
step2:在你的视图文件,加入对 favicon.ico 的引用。
在视图的部分加入
6.3springMVC
控制器 Controller
使用@Controller 或者@RestController 注释
从 SpringBoot3 推荐使用 PathPatternParser 策略。比之前 AntPathMatcher 提示 6-8 倍吞吐量。
我们看一下 PathPatternParser 中有关 uri 的定义
通配符:
? : 一个字符
*: 0 或多个字符。在一个路径段中匹配字符
**:匹配 0 个或多个路径段,相当于是所有
正则表达式: 支持正则表达式
RESTFul 的支持路径变量
{变量名}
{myname:[a-z]+}: 正则皮 a-z 的多个字面,路径变量名称“myname”。@PathVariable(“myname”)
{*myname}: 匹配多个路径一直到 uri 的结尾
6.4 RequestMapping
快捷注解
@GetMapping: 表示 get 请求方式的@RequestMapping
@PostMapping:表示 post 请求方式的@RequestMapping
@PutMapping:表示 put 请求方式的@RequestMapping
@DeleteMapping: 表示 delete 请求方式的@RequestMapping
6.5接收参数
请求参数与形参一一对应,适用简单类型。形参可以有合适的数据类型,比如 String,Integer ,int 等。
对象类型,控制器方法形参是对象,请求的多个参数名与属性名相对应。
@RequestParam 注解,将查询参数,form 表单数据解析到方法参数,解析 multipart 文件上传。
@RequestBody,接受前端传递的 json 格式参数。
HttpServletRequest 使用 request 对象接受参数, request.getParameter(“…”)
@RequestHeader ,从请求 header 中获取某项值
Reader InputStream 在方法参数中定义
Reader 或 InputStream 读取请求体的数据, 适合 post 请求体的各种数据。具有广泛性。
数组作为形参,接受多个参数值 ,请求格式 参数名=值 1&参数名=值 2.
6.6 验证参数
验证参数
编写代码,手工验证,主要是 if 语句,switch 等等。
Java Bean Validation : JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation, 是一个运行时的数据
验证规范,为 JavaBean 验证定义了相应的元数据模型和 API。
使用
依赖
VO数据类型,变量上加约束注解(条件加提示)/可以分组
@DecimalMin(value = “0”,message = “已读最小是 0”)
private Integer readCount;
控制器方法参数列表中加@Validated
可以支持分组校验
public static interface AddArticleGroup { };
@Min(value = 1, message = “文章 ID 从 1 开始”,
groups = { EditArticleGroup.class } )
private Integer id;
controller方法上 @Validated(ArticleVO.AddArticleGroup.class)
6.7model和view
控制器方法返回值和视图有是关系的。
String:如果项目中有 thymeleaf , 这个 String 表示 xxx.html 视图文件(/resources 目录) 在配置文件中配置前后缀
ModelAndView: View 中就是表示视图。
@ResponeBody , @RestController 适合前后端分离项目
String : 表示一个字符串数据
Object:如果有 Jackson 库,将 Objet 转为 json 字符串
6.8 DispatcherServle
DispatcherServlet 是核心对象,称为中央调度器(前端控制器 Front Controller)。负责接收所有对 Controller
的请求,调用开发者的 Controller 处理业务逻辑,将 Controller 方法的返回值经过视图处理响应给浏览器。
DispatcherServlet 作为 SpringMVC 中的 C,职责:
- 是一个门面,接收请求,控制请求的处理过程。所有请求都必须有 DispatcherServlet 控制。SpringMVC
对外的入口。可以看做门面设计模式。 - 访问其他的控制器。 这些控制器处理业务逻辑
- 创建合适的视图,将 2 中得到业务结果放到视图,响应给用户。
- 解耦了其他组件,所有组件只与 DispatcherServlet 交互。彼此之间没有关联
- 实现 ApplictionContextAware, 每个 DispatcherServlet 都拥自己的 WebApplicationContext,它继承了ApplicationContext。WebApplicationContext 包含了 Web 相关的 Bean 对象,比如开发人员注释@Controller的类,视图解析器,视图对象等等。 DispatcherServlet 访问容器中 Bean 对象。
- Servlet + Spring IoC 组合
6.9 springMVC自动配置类
我们看一下 SpringMVC 有关的自动配置,Spring MVC 自动配置会创建很多对象,重点的有:
ContentNegotiatingViewResolver 和 BeanNameViewResolver bean
支持提供静态资源,包括对 WebJars 的支持
自动注册 Converter、GenericConverter 和 Formatter bean。
对 HttpMessageConverters 的支持
自动注册 MessageCodesResolver
静态 index.html 支持。
自动使用 ConfigurableWebBindingInitializer bean
6.10 Servlets, Filters, and Listeners
Web 应用还会用到 Servlet、Filter 或 Listener。这些对象能够作为 Spring Bean 注册到嵌入式的 Tomcat 中。
ServletRegistrationBean、FilterRegistrationBean 和 ServletListenerRegistrationBean 控制 Servlet,Filter,Listener。
@Order 或 Ordered 接口控制对象的先后顺序。
Servlet 现在完全支持注解的使用方式,@WebServlet
6.11WebMvcConfigurer 作为配置类
采用 JavaBean 的形式来代替传统的 xml 配置文件形式进行针对框架个性化定制,就是 Spring MVC XML 配置文件的 JavaConfig(编码)实现方式。自定义 Interceptor,ViewResolver,MessageConverter。WebMvcConfigurer 就是 JavaConfig 形式的 Spring MVC 的配置文件