Spring 5 框架
一、Spring5 框架概述
-
Spring 是轻源级的开源的 Java EE 框架
-
Spring 可以解决企业应用开发的复杂性
-
Spring 有两个核心的部分: IOC 和 Aop
(1) IOC: 控制反转,把创建的对象交给 Spring 进行管理
(2) Aop: 面向切面,不修改源代码进行功能的增o
-
Spring 的 6 个特征:o核心技术 :依赖注入(DI),AOP,事件(events),资源,i18n,验证,数据绑定,类型转换,SpEL。
- 测试 :模拟对象,TestContext框架,Spring MVC 测试,WebTestClient。
- 数据访问 :事务,DAO支持,JDBC,ORM,编组XML。
- Web支持 : Spring MVC和Spring WebFlux Web框架。
- 集成 :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。
- 语言 :Kotlin,Groovy,动态语言。o
二、IoC
1. IoC 概念及原理
1.1 什么是 IoC
IoC (Inverse of Control:控制反转) 是一种设计思想,就是 将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。 IoC 并非 Spring 独有。IoC 容器是 Spring 用来实现 IoC 的载体,IoC 实际是 Map (key, value) , Map 中存放的是各种对象。
控制反转,是面向对象编程的一种设计原则,可以用来减少代码之间的耦合度。若要理解 IoC 的思想,首先需要理解设计模式中的 工厂模式,某种程度上说 IoC = 工厂模式 + 反射。
工厂模式 推荐阅读: https://www.cnblogs.com/Code-CHAN/p/14441804.html
将对象之间的相互依赖关系交给 IoC 容器来管理,并由 IoC 容器完成对象的注入。这样可以很大程度简化应用的开发,把应用从复杂的关系中解放出来。IoC 容器像一个大工厂一样,当我们需要创建一个对象的时候,只需要配置好配置文件/注解即可,完全不用考虑对象是如何创建出来的。 在实际的项目中一个 Service 类可能有几百个甚至上千个类作为它的底层。假如我们需要实例化这个 Service,可能每次都要搞清楚这个 Service 所有底层类的构造函数,这可能让人发疯。如果利用 IoC,只需要提前配置好,在以后需要的地方引用就可以了,这大大增加了项目的可维护性且降低了开发难度。
1.2 IoC 底层原理
xml 解析、工厂模式、反射
IoC 源码阅读:https://javadoop.com/post/spring-ioc
2. IoC 操作 Bean 管理
2.1 导入 Spring5 相关 jar 包
- Spring Core: 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。
- Spring Aspects : 该模块为与AspectJ的集成提供支持。
- Spring AOP :提供了面向切面的编程实现。
- Spring JDBC : Java数据库连接。
- Spring JMS :Java消息服务。
- Spring ORM : 用于支持Hibernate等ORM工具。
- Spring Web : 为创建Web应用程序提供支持。
- Spring Test : 提供了对 JUnit 和 TestNG 测试的支持
导入所需 jar 包:
![截屏2021-02-24 16.28.56](https://tva1.sinaimg.cn/large/008eGmZEgy1gnzl9p07vrj30ha06qmxx.jpg)
2.2 创建 Spring 配置文件
(1) 创建实体类 User
public class User {
public void add() {
System.out.println("add ......");
}
}
(2) 配置 Spring 文件, 使用 xml 格式
(3) 编写测试类
@Test
public void testAdd() {
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
User user = context.getBean("user", User.class);
user.add();
}
运行结果:
![截屏2021-02-24 19.35.14](https://tva1.sinaimg.cn/large/008eGmZEgy1gnzl9phixfj30la06kt98.jpg)
可以看到 User 类被的创建出来,并成功调用 add()
方法。
2.3 BeanFactory 接口
1、IoC 思想基于 IoC 容器完成,IoC 容器底层就是对象工厂
2、Spring 提供 IoC 容器实现的两种实现方式:(两个接口)
(1) BeanFactory: IoC 容器基本实现,是 Spring 内部的使用接口,不提供给开发人员使用。
加载配置文件时候不会创建对象,在获取对象的时候才去创建
(2) ApplicationContext: BeanFactory 接口的子接口,提供更多更强的功能,一般由开发人员使用。
加载配置文件时就会把配置文件对象进行创建
![截屏2021-02-24 19.54.25](https://tva1.sinaimg.cn/large/008eGmZEgy1gnzl9pxqirj31ky0n4ac7.jpg)
2.4 基于 xml 方式创建对象
1、基于 xml 方式创建对象
<bean id="user" class="com.spring5.demo.entity.User"></bean>
(1) 在 Spring 配置文件中,使用 bean 标签,标签里面添加对应属性,就可以实现对象创建
(2) 在 bean 标签有很多属性,常见为以下两个属性:
id 属性: 唯一标识
class 属性: 类全路径
(3) 创建对象时,默认执行无参构造完成对象的创建
2、基于 xml 方式注入属性
DI: 依赖注入,就是注入属性。
3、第一种注入方式:使用 set 方法进行注入
(1) 创建类,定义属性和相应的 set 方法
public class Book {
private String bookName;
private String bookAuthor;
public void setBookName(String bookName) {
this.bookName = bookName;
}
public void setBookAuthor(String bookAuthor) {
this.bookAuthor = bookAuthor;
}
}
(2) 在 Spring 配置文件配置对象创建,配置属性注入
<bean id="book" class="com.spring5.demo.entity.Book">
<property name="bookName" value="Java 编程思想"></property>
<property name="bookAuthor" value="埃克尔"></property>
</bean>
- set 方法注入属性
- 使用 property 标签完成属性的注入
- name: 类属性名称
- **value:**注入的值
4、第二种注入方式:使用有参构造进行注入
(1) 创建类,定义属性和有参构造函数
public class Order {
private String orderName;
private String orderAddress;
public Order(String orderName, String orderAddress) {
this.orderName = orderName;
this.orderAddress = orderAddress;
}
}
(2) 在 Spring 配置文件进行配置
<bean id="order" class="com.spring5.demo.entity.Order">
<constructor-arg name="orderName" value="C++ Primer"></constructor-arg>
<constructor-arg name="orderAddress" value="BeiJin"></constructor-arg>
</bean>
- 有参构造注入属性
- 使用 constructor-arg 标签完成属性的注入
- name: 类属性名称
- **value:**注入的值
2.5 xml 注入其他类型属性
在 2.4 中我们只进行了字符串类型的属性注入,若我们需要注入其他类型的属性或者特殊符号<>
,则需要掌握以下内容。
1、字面量
(1) null 值
<property name="bookName">
<null/>
</property>
(2) 属性包含特殊字符
<property name="bookName">
<value><![CDATA[<<MySQL必知必会>>]]></value>
</property>
- 属性包含特殊字符
- 把
<
,>
进行转义<
,>
- 把带特殊符号的内容写到 CDATA
- 把
2、注入属性-外部 bean
(1) 创建两个类 service 类和 dao 类
(2) 在 service 调用 dao 里面的方法
public class UserDao {
public void update() {
System.out.println("update ......");
}
}
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
System.out.println("service add ......");
userDao.update();
}
}
(3) 在 Spring 配置文件中进行配置
<bean id="userDao" class="com.spring5.demo.dao.UserDao"></bean>
<bean id="userService"