网站
官网:Spring.io
mvnrepository.com
Spring是一个全家桶,都基于底层Spring Framework搭建的工具框架
SpringBoot是为了加速开发效率而产生的框架
目前使用的是Spring Framework 4.x的架构图(趋于稳定)
核心容器:Core Container(装对象)
AOP:面向切面编程(不惊动原始程序,给他增加功能)
Aspects:AOP思想实现
学习路线
IoC(Inversion of Control)控制反转
目的:降低耦合性。对象的创建控制权由程序转移到外部。
private BookDao bookDao = new BookDao();
=> private BookDao bookDao;
Spring技术对IoC思想进行了实现
Spring提供了一个容器,称为IoC容器,用来充当IoC思想中的"外部"(IoC容器管理大量的对象)
IoC容器负责对象的创建、初始化等一系列工作,被创建或被管理的对象在Ioc容器中统称为Bean
DI ( Dependency Injection )依赖注入
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入
**目的:**充分解耦
使用IoC容器管理bean (IoC)
在IoC容器内将有依赖关系的bean进行关系绑定(DI)
最终效果:使用对象时不仅可以直接从IoC容器中获取,并且获取到的bean已经绑定了所有的依赖关系
IoC入门案例思路分析
1.管理什么? ( Service与Dao )
2.如何将被管理的对象告知IoC容器?(配置)
3.被管理的对象交给IoC容器,如何获取到Ioc容器?(接口)4.Ioc容器得到后,如何从容器中获取bean ?(接口方法)
4.Ioc容器得到后,如何从容器中获取bean ?(接口方法)
5.使用Spring导入哪些坐标? ( pom.xml )
– 实操
①导入spring坐标spring-context坐标
在pom.xml配置文件配置坐标
<dependencies>
<dependency>
<groupId>org.springframework<groupId>
<artifactId>spring-context<artifactId>
<version>5.2.10.RELEASE<version>
</dependency>
</dependencies>
在app中创建applicationContext.xml
②在applicationContext.xml配置bean
③获得Ioc容器(main方法)
// ApplicationContext 是接口,new实现类
ApplicationContext ctx = ClassPathXmlApplicationContext(“applicationContext.xml”);
④获得bean(main方法)
BookDao bd = (BookDao) ctx.getBean(“BookDao”);
调用bookDao方法
DI入门案例
- 基于IoC管理bean
- Service中使用new形式创建的Dao对象是否保留?(否)
- Service中需要的Dao对象如何进入到service中?(提供方法)
- Service与Dao间的关系如何描述?(配置)
– 实操
删除业务层中使用new方式创建的dao对象
SeviceImpl类 提供对应的set方法。
配置service与dao的关系(绑定),dao放到service
property标签表示配置当前bean的属性
name 属性表示配置哪一个具体的属性
ref 属性表示参照哪一个bean
<bean id="bookService" class="com.itheima.xx">
<property name="bookDao"【类中名】
ref="bookDao"【容器中的名】>
</bean>
bean配置
bean基础配置 id,name,class
bean别名配置
bean中的name属性起别名,使用“逗号分号空格”分隔,可被getbean()、ref=“”,
注意事项:获取bean无论是通过id还是name获取,如果无法获取到,将抛出异常NoSuchBeanDefinitionException
bean作用范围配置
bean默认是单例(scope=“singleton”),非单例 prototype
为什么bean默认为单例?
若非单例,则Ioc容器有无穷无尽个bean,spring不适合管理bean
适合交给容器进行管理的bean
表现层对象(sevlet)、业务层对象(service)、数据层对象(dao)、工具对象
不适合交给容器进行管理的bean
封装实体的域对象(domain),里面有状态,有数据,已经记录成员变量的属性值
bean实例化
创建形式
spring创建时,调的是无参构造方法
spring创建时,private构造方法也能被调用(底层使用了反射)
实例化bean的三种方式
1、构造方法实例化bean。
实现类的构造方法。无参构造方法不存在,BeanCreateEception
2、使用静态工厂实例化bean(解耦)
- 静态工厂
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
return new OrderDaoImpl();
}
}
3、使用实例工厂实例化bean
3.1 (实用) 使用FactoryBean 实例化bean(大量的框架都在这样和spring打交道)
bean生命周期
控制生命周期结束前do sth
①使用关闭容器方法(配置方式)
注意:虚拟机退出并没有bean销毁机制,执行destroy方法
解决:主动关闭容器(暴力)
new ClassPathXmlApplicationContext(“applicationContext.xml”).close();
关闭钩子(可放在任意位置)
ctx.registerShutdownHook();
②使用spring提供的接口控制生命周期
implements InitializingBean,DisposabelBean接口
afterPropertiesSet() 和 destroy()
依赖注入方式
setter注入
构造器注入
①标准书写配置(耦合度高,参数改名就不行)
②解决参数名称问题,与形参不耦合
name → type=“java.lang.String” 指定参数类型
③解决参数类型重复问题
name → index=“0” 位置
1、强制依赖:必须全部注入,否则无法创建对象
依赖自动装配
注入集合对象
List(重点)
数据源对象管理
第三方资源配置管理
添加坐标,在pom.xml,dependencies中
druid
管理DruidDataSource对象
C3p0连接池
1、 mvnrespository.com 找坐标
2、pom.xml找到C3p0连接池对象
com.mchange.v2.c3p0.ComboPooledDataSource
3、逐个试试名字
mysql坐标
1、 mvnrespository.com 找坐标
加载properties文件
resources / jdbc.properties
①开启context命名空间
②使用context空间加载properties文件
<context:property-placeholder location=“jdbc.properties”/>
**不加载系统环境变量:**system-properties-mode=“NEVER”
加载多个配置文件:location=“classpath: *.properties”
加载外工程(jar包)的多个配置文件:location=“classpath*****: *.properties”
③使用属性占位符${}读取properties文件中的属性
容器
~~总结
容器
注解开发
@component(“”) 相当于配置了一个bean
扫描包
xml:<context:component-scan base-package=“com.it”>
衍生注解
纯注解开发(配置类)
配置类(替换xml)
com.it.config.SpringConfig
@Configuration
@ComponentScan(“com.it”)
class{}
Main类
new AnnotationConfigApplicationContext(SpringConfig.class);
从xml配置形式 → 读取配置类
ClassPathXmlApplictionContext → AnnotationConfigApplicationContext
注解开发bean范围与生命周期
@Scope(“prototype”) 非单例
class{}
@PostConstruct 构造方法后
function(){}
@PreDestroy 摧毁方法前
function(){}
依赖注入(自动装配)
@Autowired 暴力反射,无需setter入口
private BookDao bookDao;
SpringConfig.class 添加 @PropertySource(“jdbc.properties”)
@Value(“${name}”)
String name;
第三方bean管理(jar包)
处理:在SpringConfig.class中导入@Import(JdbcConfig.class)
在JdbcConfig.class编程去写(没有其他办法)
2、添加@Bean方法返回值定义成bean
@Bean
1、定义一个方法获得要管理的对象
public DataSource datasource() {
DruidDataSource ds = new DruidDataSource();
配置属性
ds.setDriverClassName(“”); 使用@Value注入
ds.setUrl(“”);
ds.setUsername(“”);
ds.setPassword(“”);
return ds;
}
扫描式(不推荐)
引用类型(自动装配)
~~注解开发总结
XML配置 vs 注解配置
====================
Spring 整合mybatis
核心对象SqlSessionFactory
SqlMapConfig.xml
https://blog.csdn.net/qq_46020525/article/details/128013377
mybaties应该管理核心对象SqlSessionFactory
①插入坐标dependency
- mybatis
- spring-jdbc:spring操作与数据库有关的坐标
- mybatis-spring:mybatis与spring整合用的坐标
② 整合mybatis:配置文件,数据源配置,jdbc配置
SqlSessionFactoryBean 专门用来造对象
MapperScannerConfigurer 代理点
Spring整合Junit
① 依赖包
Test路径 /src/test/java/com.it.service.AccountServiceTest
//测试类
@RunWith(SpringJUnit4ClassRunner.class) //专用类加载/运行器
@ContextConfiguration(classes = SpringConfig.class) //指定Spring配置(Bean处)
public class AccountServiceTest {
@Autowired
AccountService accountService;
@Test
public void testFindById() {
System.out.println(accountService.findById(2));
};
}
AOP 面向切面编程
一种编程范式,指导开发者如何组织程序结构
- 作用:在不惊动原始设计(不需改动源代码)的基础上为其进行功能增强
- Spring理念:无入侵式编程
入门案例
Aspect包
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
AOP工作流程
切入点表达式
AOP通知类型
标准写法,方法返回Object
@Around
public Object around(ProceedingJoinPoint pjp) throws Throwable{
println();
Object ret = pjp.proceed();
println();
return ret;
}
@案例:测量业务层接口万次执行效率
AOP通知获取信息
案例:密码数据兼容处理(trim)
~~AOP总结
Spring事务 + 案例
案例:银行账户转账
@Transactional
事务角色
- 事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法
- 事务协调员:加入事务方,在Spring中通常指代数据层方法,也可以是业务层方法
事务属性(追加日志)
SpringMVC
- SpringMVC为表现层框架,也可以称作web框架
SpringMVC简介
入门案例
工作流程
bean加载控制
apiFox 调试工具
- Postman
请求映射路径
映射路径前缀:加在类名上一行
@RequestMapping(“”)
GET & POST请求
五种参数类型传递
JSON 数据传参
日期参数传递
响应
无@ResponseBody,返回的是文件页面
对象转成json数据,return new User(); 底层并不是springmvc处理,而是jackson类型转换器做的
REST风格
入门案例
RESTful快速开发(简化)
小结:
- RESTful快速开发(标准开发)
- @RestController
- 标准请求动作映射(4种)
~~案例
SSM整合
表现层数据封装
异常处理器
项目异常处理方案
案例:SSM整合标准开发
<dependencies>
1 spring-jdbc
1 mysql-connector-java
1 druid
3 mybatis
3 mybatis-spring
2 spring-test
2 junit
4 spring-webmvc
4 javax-sevlet-api
0 jackson-databind
</dependencies>
<build>
tomcat7-maven-plugin
</bulid>
表现层与前端数据传输协议
小结
- 表现层数据封装
- Result
- Code
异常处理器
项目异常处理
项目异常处理方案
- 异常处理器
- 自定义异常
- 异常编码
- 自定义消息
拦截器
拦截器参数
拦截器链
- 分模块开发 -
- 分模块开发与设计
- 依赖管理
- 聚合与继承
- 属性管理
- 多环境配置与应用
- 私服
目标:
- 理解分模块开发的意义
- 能够使用聚合工程快速构建项目
- 能够使用继承简化项目配置
- 能够根据需求配置生产、开发、测试环境,并在各环境间切换运行
依赖传递
可选依赖、排除依赖
<optional>true
<exclusion><exclusions>
聚合、继承
继承:选择性
属性
配置文件加载属性
多环境开发
跳过测试 快速打包
私服
私服仓库
本地仓库访问私服
SpringBoot
学习目标
- 掌握基于SpringBoot框架的程序开发步骤
- 熟练使用SpringBoot配置信息修改服务器配置
- 基于SpringBoot的完成SSM整合项目开发
SpringBoot快速启动
简介(起步依赖)
切换Web服务器
基础配置
主用yml(可以存储对象)
logging:
level:
root: debug(较多内容) | warn(常用) | info(默认)
yaml格式
读取yaml数据
yml多环境配置
启动命令
多环境开发兼容
配置文件分类
SpringBoot整合Junit
整合Mybatis
MyBatis Plus
简介
lombok
分页功能
热部署
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId><optional>true</optional>
</dependency>
日志框架
log4j
日志门面 slf4j(适配器,桥接器) --目前最好用
适配器:将别的日志都转换为slf4j门面
桥接器:slf4j实现某个具体日志
java.util.logging(jul)
日志门面:jakarta Commons Logging(不实现日志功能,整合日志)
原理使用ClassLoader找类,对于自定义类,容易出现内存溢出
日志实现 | 日志门面 |
---|---|
log4j | JCL |
jul | slf4j |
log4j2 | |
logback |
桥接器(整合):
<slf4j-api>
<slf4j-log4j>
适配器(over):
<jcl-over-slf4j
<jul-to-slf4j
log4j(控制台输出白色字)
jul(控制台输出红色字)
日志优先
trace < info < debug < warn < error < fatal
springboot 整合logback
SpringBoot日记代码步骤
1、声明日志记录器
Logger logger = LoggerFactory.getLogger(Application.class)
或者
@Slf4j —— Lombok(不建议使用,侵入性太强)
- pattern格式(springboot官网4.7章节中)
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}
= %clr( %d{${value:value2}} ) {faint}
clr = color; faint = 无色
if (value == null) → ${value2} 【null表达式】
输出到文件File output
logging.file.name/path