Spring 概述
1 spring家族
(1) Spring Framework
Spring框架,是Spring中最早最核心的技术,也是所有其他技术的基础。
//Spring Framework是Spring生态圈中最基础的项目,是其他项目的根基。
//以下所学的Spring其实是Spring家族中的Spring Framework。
(2) SpringBoot
Spring是来简化开发,而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。
(3) SpringCloud
这个是用来做分布式之微服务架构的相关开发。
2 Spring系统架构
(1) 核心层
Core Container:核心容器,这个模块是Spring最核心的模块,其他的都需要依赖该模块。
(2) AOP层
AOP:面向切面编程,它依赖核心层容器,目的是在不改变原有代码的前提下对其进行功能增强。
Aspects:AOP是思想,Aspects是对AOP思想的具体实现。
(3) 数据层
Data Access:数据访问,Spring全家桶中有对数据访问的具体实现技术。
Data Integration:数据集成,Spring支持整合其他的数据层解决方案,比如Mybatis。
Transactions:事务,Spring中事务管理是Spring AOP的一个具体实现,也是后期学习的重点内容。
(4) Web层
这一层的内容将在SpringMVC框架具体学习。
(5) Test层
Spring主要整合了Junit来完成单元测试和集成测试。
3 Spring核心概念
(1) IOC(Inversion of Control)控制反转
<1> 概述
使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
//使用对象时,在程序中不要主动使用new产生对象,转换为由外部提供对象。
<2> Spring和IOC之间的关系
Spring技术对IOC思想进行了实现。
Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的"外部"。
IOC思想中的[外部]指的就是Spring的IOC容器。
<3> IOC容器作用
IOC容器负责对象的创建、初始化等一系列工作,其中包含了数据层和业务层的类对象。
被创建或被管理的对象在IOC容器中统称为Bean,IOC容器中放的就是一个个的Bean对象。
<4> 在容器中建立对象与对象之间的绑定关系就要用到DI。
//例:当IOC容器中创建好service和dao对象后,程序不能正确执行。
//因为service运行需要依赖dao对象,IOC容器中虽然有service和dao对象但是service对象和dao对象没有任何关系。
//需要把dao对象交给service,也就是说要绑定service和dao对象之间的关系。
(2) DI(Dependency Injection)依赖注入
<1> 概述
在容器中建立bean与bean之间的依赖关系的整个过程,称为依赖注入。
//业务层要用数据层的类对象,不是通过new生成对象,而是靠IOC容器来给注入进来。
<2> IOC容器中哪些bean之间要建立依赖关系
这个需要程序员根据业务需求提前建立好关系,如业务层需要依赖数据层,service就要和dao建立依赖关系。
(3) IOC和DI目的:充分解耦
<1> 使用IOC容器管理bean(IOC)。
<2> 在IOC容器内将有依赖关系的bean进行关系绑定(DI)。
<3> 最终结果为:使用对象时不仅可以直接从IOC容器中获取,并且获取到的bean已经绑定了所有的依赖关系。
//项目所要使用的所有类都放入IOC容器中,作为bean存在,使用时直接从IOC容器中获取。
//但有些bean运行依赖于其他bean,这时必须利用DI思想,建立依赖关系,将bean赋值给对应对象属性。
//建立依赖关系后,运行该bean时,自动将其所依赖的bean赋值给对应属性。
//必须现有IOC容器中的bean才可以建立依赖关系,DI思想建立在IOC思想基础上。
4 IOC快速入门
(1) 创建Maven的java项目
(2) pom.xml添加Spring的依赖jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.10.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
(3) 创建案例中所被使用的类
public interface BookDao {
public void save();
}
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("BookDaoImpl_save");
}
}
public interface BookService {
public void save();
}
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDao();
public void save() {
System.out.println("BookServiceImpl_save");
bookDao.save();
}
}
(4) 添加spring配置文件
//将被管理的对象告知IOC容器。
//文件类型为XML Configuration File(Spring Config)
//resources下添加spring配置文件applicationContext.xml,并完成bean的配置。
(5) 在配置文件中完成bean的配置
<?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标签标示配置bean;
id属性标示给bean起名字;
class属性表示给bean定义类型-->
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
</beans>
(6) 获取IOC容器
//使用Spring提供的接口完成IOC容器的创建,创建App类,编写main方法。
public class App {
public static void main(String[] args) {
//获取IOC容器
ClassPathXmlApplicationContext cpxac = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
(7) 从容器中获取对象进行方法调用
public class App {
public static void main(String[] args) {
//获取IOC容器
ClassPathXmlApplicationContext cpxac = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) cpxac.getBean("BookDao");
//对象在IOC容器取出时,默认为object类型,需强转为对应数据类型。
bookDao.save();
// BookService bookService = (BookService) ct.getBean("bookService");
// bookService.save();
}
}
//运行结果:BookDaoImpl_save
5 DI快速入门
(1) 去除代码中的new
//在ServiceImpl类中,删除业务层中使用new的方式创建的dao对象。
public class BookServiceImpl implements BookService {
public void save() {
BookDao bookDao;
//删除业务层中使用new的方式创建的dao对象
//BookDao bookDao = new BookDao();
System.out.println("BookDaoImpl_save");
bookDao.save();
}
}
(2) 声明属性并提供setter方法
//setter方法相当于注入时的入口,由Ioc容器从入口将bean注入。
//在bookServiceImpl类中,为bookDao提供setter方法。
public class BookServiceImpl implements BookService {
private BookDao bookDao;
//将其提升为全局变量
public void save() {
System.out.println("BookDaoServiceImpl_save");
bookDao.save();
}
//提供对应的set方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
}
(3) 修改配置完成注入
<?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 id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
<bean id="bookService" class="com.itheima.service.impl.BookServiceImpl">
<!--配置server与dao的关系-->
<!--property标签表示配置当前bean的属性;
name属性表示代码中的bean所要赋值的属性,更准确地说是setter方法方法名去掉set后首字母小写;
ref(reference)属性表示参照哪一个bean-->
<property name="bookDao" ref="bookDao"/>
<!--第一个bookDao代表bean所需要赋值给的具体属性名bookDao(bookServiceImpl中的属性),第二个bookDao代表id为bookDao的bean。-->
<!--意为bookService对象运行需要bookDao对象,运行时将bookDao对象赋值给bookService中的属性bookDao。-->
</bean>
<!--注意若有依赖关系<bean>为双标签。-->
</beans>
//注意:配置中的两个bookDao的含义是不一样的
//name="bookDao"中bookDao的作用是让Spring的IOC容器在获取到名称后,将首字母大写,前面加set找对应的setbookDao()方法进行对象注入。
//ref="bookDao"中bookDao的作用是让Spring能在IOC容器中找到id为bookDao的Bean对象给bookService进行注入。
(4) 从容器中获取对象进行方法调用
public class App {
public static void main(String[] args) {
//获取IOC容器
ClassPathXmlApplicationContext cpxac = new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookService = (BookService) cpxac.getBean("bookService");
//对象在IOC容器取出时,默认为object类型,需强转为对应数据类型。
bookService.save();
}
}
//运行结果:BookServiceImpl_saveBookDaoImpl_save

浙公网安备 33010602011771号