Spring
介绍
官网:https://spring.io
目前版本:Spring web 5.3.19 maven,仓库地址
Spring 是一个支持快速开发 Java EE 应用程序的框架,简化了 Java web 开发操作
Spring Framework主要包括几个模块:
- 支持 IoC 和 AOP 的容器;
- 支持 JDBC 和 ORM 的数据访问模块;
- 支持声明式事务的模块;
- 支持基于 Servlet 的 MVC 开发;
- 支持基于 Reactive 的 Web 开发;
- 以及集成 JMS、JavaMail、JMX、缓存等其他模块
优点
- 免费开源、轻量、非入侵
- 控制反转(IOC),面向切面编程(AOP)
- 支持事务处理,对框架整合的支持、
组成
扩展
Spring Boot
- 快速开发脚手架
- 基于 SpringBoot 可以快速开发单个微服务
- 和 Maven 一致:约定大于配置
Spring Cloud
- SpringCloud 基于 SpringBoot 实现
SpringBoot 现在公司用的比较多,学习 SpringBoot 的前提是学习 SpringMVC
IOC
Spring:IOC本质分析探究,IoC原理
在 IoC 模式下,控制权发生了反转,即从应用程序转移到了IoC容器,所有组件不再由应用程序自己创建和配置,而是由 IoC 容器负责,这样,应用程序只需要直接使用已经创建好并且配置好的组件
控制反转 IoC(Inversion of Control),是一种设计思想,DI (依赖注入)是实现 IoC 的一种方法,也有人认为 DI 只是 IoC 的另一种说法。没有 IoC 的程序中 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了
Spring 的核心就是提供了一个 IoC 容器,它可以管理所有轻量级的 JavaBean 组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP 支持,以及建立在 AOP 基础上的声明式事务服务等
Demo
接下来我们使用 XML 方式配置 Bean,采用 XML 方式配置 Bean 的时候,Bean 的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean 的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的
控制反转是一种通过描述(XML 或注解)并通过第三方去生产或获取特定对象的方式。在 Spring 中实现控制反转的是 IoC 容器,其实现方法是依赖注入(Dependency Injection,DI)
- 创建 Maven 项目
- 导入 Spring 相关 jar 包
<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.19</version>
</dependency>
- 编写一个 Hello 实体类
- 编写 spring 文件 , 这里命名为 beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--bean就是java对象 , 由Spring创建和管理-->
<bean id="hello" class="com.ocean.pojo.Hello">
<property name="str" value="Spring"/>
</bean>
</beans>
注:ref 引用 Spring 容器中创建好的对象,value 引用具体的值
- 编写实现类
public class MyTest {
public static void main(String[] args) {
// 获取Spring的上下文对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
// 因为对象都在Spring中管理了,所以要使用的话直接取出来即可
Hello hello = (Hello) applicationContext.getBean("hello");
System.out.println(hello.toString());
}
}
再去看 pojo 对象可以发现有特殊的标记
Spring 容器在初始化时先读取配置文件,根据配置文件或元数据创建与组织对象存入容器中,程序使用时再从 Ioc 容器中取出需要的对象
这个过程就叫控制反转 :
控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用 Spring 后 , 对象是由 Spring 来创建的
反转 : 程序本身不创建对象 , 而变成被动的接收对象
依赖注入 : 就是利用 set 方法来进行注入的,可以看到 set 方法前边有特殊标记
IOC 是一种编程思想 , 由主动的编程变成被动的接收
到了现在 , 我们彻底不用再程序中去改动了 , 要实现不同的操作 , 只需要在xml配置文件中进行修改 , 所谓的 IoC,一句话搞定 : 对象由 Spring 来创建 , 管理 , 装配 !
创建 IOC 对象
- 默认使用无参构造方法创建对象
- 有参构造创建对象的方法
- 下标赋值
<bean id="user" class="com.ocean.pojo.Hello">
<constructor-arg index="0" value="Ocean"/>
</bean>
- 通过类型
<bean id="user" class="com.ocean.pojo.Hello">
<constructor-arg type="java.lang.String" value="ocean" />
</bean>
- 通过参数名
<bean id="user" class="com.ocean.pojo.Hello">
<constructor-arg name="str" value="ocean" />
</bean>
在配置文件加载的时候,容器中管理的对象已经初始化了
配置
别名
<alias name="user" alias="test"/>
添加了别名,也可以使用别名获取到这个对象
Bean 的配置
<bean id="user" class="com.ocean.pojo.Hello" name="hello,hell2;hello3">
<property name="str" value="ocean"/>
</bean>
也可以 name 中配置别名
import
一般用于团队开发,可以将多个配置导入使用
<import resource="beans.xml"/>
依赖注入
- 构造器注入,之前已经介绍过了
- set 方式注入(重点)
依赖:bean 对象的创建依赖于容器
注入:bean 对象中的所有属性,有容器来注入
新建数据对象
补充 setter 和 getter 方法
<!--第一种,普通值注入,value-->
<property name="name" value="ocean"/>
<!--第二种,Bean注入,ref-->
<property name="address" ref="address"/>
参考
- 狂神说Java
- 廖雪峰的官方网站