文章目录
- 1. IoC
- DI
- 2. Spring项目创建和使用
- ApplicationContext和BeanFactory的区别
1. IoC
Spring是一个包含多个工具方法的IoC容器
tomcat是web容器
List/Map是数据存储容器
IoC:Inversion of Control(控制反转)
将对象的控制权交给Spring,自己不在需要管理所有的对象。
在程序开发中,经常出现一个对象的创建依赖另一个对象的情况,如果采用在对象内new依赖对象,这样会导致代码的耦合性比较高。
底层依赖初始化发生改变,会导致整体改变。
可以选择通过传参的方式,将依赖的对象以参数的形式传递进来。这样依赖的对象发生改变,上层代码不需要改变。
上述过程就是一种控制权反转过程,将依赖对象的控制权反转。达到解耦目的。
这就是IoC的思想
IoC的优点:
- 实现代码解耦
- 对象的声明周期交给IoC框架维护,不需要关注对象的声明周期。
Spring IoC的核心功能
- 将对象存储到Spring中
- 将对象从Spring中取出
学习Spring的核心就是学习如何将对象存放到Spring中,再从Spring中取出对象的过程
DI
DI:Dependency Injection 依赖注入
依赖注入:IoC运行器件,动态的将某种关系注入到对象中,通过引入Ioc容器,利用依赖关系注入的方式实现对象的解耦。
IoC与DI的区别是什么
- IoC是实现目标的一种思想,DI就是具体实现
2. Spring项目创建和使用
创建Spring核心项目,将对象存储到Spring中,从Spring中取出对象
创建项目:
- 首先创建maven项目
- 添加spring框架支持(spring-context、spring-beans)
- 创建启动类,添加main方法
注意:如果没有梯子,需要切换maven国内源,这里并不在介绍。
如果包下载失败,找到setting,找到本地仓库,将本地仓库全部删除后重新下载
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
</dependencies>
将对象储存到Spring中
- (首次)在Spring项目中添加配置文件
- 创建Java对象
- 在配置文件中将要保持到Spring中的Java对象进行注册
在Spring项目中添加配置文件:resource文件下新增文件,这个文件名称为xxx.xml(这里以spring.xml举例)
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">
</beans>
创建Java对象:
将对象通过配置文件,注册到Spring中
bean标签就是代表注册对象。
id属性类似于key,value。从Spring中拿注册的对象就是靠id属性。
class属性指的是要注册的Java类名。
id和class类名可以不同,二者没有任何关系。一般id为小驼峰,类名使用大驼峰。
从Spring中将对象取出:
- 得到Spring上下文对象
- 通过上下文对象提供的方法,获取Spring中需要的Java对象,并使用。
获取Spring上下文对象
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class FirstSpring {
public static void main(String[] args) {
System.out.println("Hello Spring");
//获取Spring上下文对象,传入Spring配置文件名称,这里是spring.xml
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//通过上下文对象提供的方法获取需要的对象,传递对象id值,不是类名
user u = (user) context.getBean("userInfo");
u.Print("Spring");
}
}
由上图可知,对象通过Spring获取,实现了解耦。
此外Spring上下文信息不仅仅可以通过ApplicationContext获取,还可以通过BeanFactory来获取。
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
public class FirstSpring {
public static void main(String[] args) {
System.out.println("Hello Spring");
//获取Spring上下文对象,传入Spring配置文件名称,这里是spring.xml
//ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//通过上下文对象提供的方法获取需要的对象,传递对象id值,不是类名
// user u = (user) context.getBean("userInfo");
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring.xml"));
user u = (user) factory.getBean("userInfo");
u.Print("Spring");
}
}
ApplicationContext和BeanFactory的区别
相同点:都可以从容器中获取对象,都提供了getBean方法
不同点:
-
ApplicationContext是BeanFactory的子类
BeanFactory只提供基础访问bean对象方法
ApplicationContext在BeanFactory的基础上提供了更多的方法实现(国际化支持,资源访问支持等)
-
BeanFactory是按需加载对象bean,ApplicationContext是饿汉模式,在创建时会将所有的Bean对象加载起来。
ApplicationContext业务响应快,系统资源开销大
BeanFactory节省系统资源,业务响应懒加载模式,响应慢。