文章目录
- 初识Spring
- 什么是Spring框架
- Spring核心设计思想
- Spring的核心特性
- 什么是IOC容器?---控制反转(IoC)
- 容器的基本概念
- 什么是IOC
- Spring的另一个特性:DI
- Spring特性:DL
- Spring的主要模块
- 创建Spring项目
- 创建maven项目
- 添加spring依赖
- 创建启动类
- 创建bean对象
- 添加spring配置文件
- 创建Bean对象
- 注入bean对象
- 读取Bean对象
- 另一种获取bean的方法
- ApplicationContext 和 BeanFactory 的区别
- 总结
- 结束语
初识Spring
什么是Spring框架
我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因;Spring 支持广泛的应用场景,它可以让 Java 企业级的应用程序开发起来更简单。
什么是Spring,通俗的理解,就是将很多工具和方法集合起来,打包成一个易于使用的工具(也称框架)
Spring核心设计思想
Spring 框架是包含了众多工具方法的 IoC 容器。
Spring的核心特性
什么是IOC容器?—控制反转(IoC)
容器的基本概念
容器是用来容纳某种物品的(基本)装置。 ——来⾃:百度百科
Java 中也有一些容器,比如 List,Map这些集合,是数据储存容器,Tomcat 是 Web 容器,同理 Spring 是就一个 IoC 容器,它包含了许多的工具和方法。
什么是IOC
IoC即Inversion of Control,控制反转。在传统的Java应用中,我们直接在对象内部通过new关键字来创建依赖的对象。
Spring的另一个特性:DI
在Spring中,对象的创建和绑定都由Spring框架来管理,我们只需要在配置文件中声明好对象及其依赖关系,Spring就会自动帮我们创建对象并注入依赖。这种方式也被称为依赖注入(DI)。
Spring特性:DL
DL,即Dependency Lookup,依赖查找,也是 IoC的一种实现。
依赖查找和依赖注入的区别在于,依赖注入是将依赖关系委托给容器,由容器来管理对象之间的依赖关系,容器外部是不关心这种依赖关系的,需要时由容器判断提供什么;而依赖查找是由对象自己来查找它所依赖的对象,容器只负责管理对象的生命周期,也就是说此时需要容器外部自己确定要容器提供哪种依赖关系;两者之间是主动和被动的区别。
Spring的主要模块
Spring框架包含了许多模块,每个模块都有其特定的功能。以下是一些主要的模块:
Spring Core:提供了IoC容器,以及对Bean的管理和配置。
Spring Context:基于Core模块,提供了上下文信息,以及对企业级特性的支持,如JNDI、EJB等。
Spring DAO:提供了JDBC的抽象层,以及对声明式事务的支持。
Spring ORM:提供了对ORM框架的支持,如Hibernate、MyBatis等。
Spring Web:提供了对Web开发的支持,如Spring MVC、WebSocket等。
创建Spring项目
创建maven项目
在idea中创建一个空的maven项目
添加spring依赖
在 Maven 项目中添加 Spring 的支持(spring-context, spring-beans)
在pom.xml中添加如下依赖
<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>
创建启动类
创建启动类与main方法,用来做简单的测试
在 java 目录创建类,实现main方法,这里的main方法即使启动类。
创建bean对象
添加spring配置文件
bean即是对象的意思,Spring的核心是IOC控制反转,即将对象的管理权限交给Spring来实现。
右键单机resources目录,新建一个spring-config.xml配置文件。(此处的文件名无要求,但是尽量规范化)
将如下代码配置到Spring-config.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>
创建Bean对象
创建Bean对象。
我们要注入一个user对象,先创建一个user类。
package com.tr.demo;
public class User{
public void sayHi(String name) {
System.out.println("Hello!" + name );
}
}
注入bean对象
在本配置文件中,添加如下代码
<bean id="user" class="com.beans.User"></bean>
id代表的是自己给该对象起的名字,后续获取该对象时需要使用。class则是文件路径
读取Bean对象
想要从 Spring 中将Bean对象读取出来,先要得到 Spring 上下文对象,相当于得到了 Spring 容器。
再通过 spring 上下文对象提供的方法获取到需要使用的Bean对象,最后就能使用Bean对象了。
ApplicationContext,也称为控制反转(IoC)容器,是 Spring 框架的核心。
import com.tr.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class APP {
public static void main(String[] args) {
// 1. 得到上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2. 获取 bean 对象,这里根据 id 获取
User user = (User) context.getBean("user");
// 3. 使用 bean
user.sayHi("张三");
}
}
注意,此处的getbean返回的是Object对象,返回值需要强制类型转换
getBean方法中的参数即是刚刚在xml的bean标签中添加的id属性,并且Spring提供了该方法的重载。
我们可以在xml文件中添加多个bean,同时这些bean的id(xml文件中是id,Java中更喜欢叫name)或者class属性是可以相同的,也可以是同一个类。
所以用name区分bean有时候是不靠谱的,比如同一个班级可能会有重名的现象,这时候通过名字来确认bean是不靠谱的,需要更多其他的细节。
以下是getbean的一种重载方法,通过.class来获取bean
import com.tr.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class APP {
public static void main(String[] args) {
// 1. 得到上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2. 获取 bean 对象,这里根据 id 获取
User user = context.getBean(User.class);
// 3. 使用 bean
user.sayHi("张三");
}
}
当然,通过.class获取bean也是不靠谱的,因为可以添加多个相同的bean
值得注意的是,因为getbean传入了.class文件,则返回值不需要强制类型转换
所以,更推荐使用name+class的双重确认。相对于上面两种方法,能够更加容易得到自己想要的bean。
import com.tr.demo.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class APP {
public static void main(String[] args) {
// 1. 得到上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
// 2. 获取 bean 对象,这里根据 id 获取
User user = context.getBean("user",User.class);
// 3. 使用 bean
user.sayHi("张三");
}
}
另一种获取bean的方法
此外,也可以使用BeanFactory来获取bean
import com.tr.demo.Student;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
public class APP2 {
public static void main(String[] args) {
// 1. 得到 bean 工厂
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("spring-config.xml"));
// 2. 获取 bean 对象
User user= (User) factory.getBean("user");
// 3. 使用 bean
user.sayHi("李四");
}
}
ApplicationContext 和 BeanFactory 的区别
1.BeanFactory 是非IOC容器,而ApplicationContext 是IOC容器
2.ApplicationContext是BeanFactory的子类, BeanFactory只提供了基础访问Bean对象的功能,而ApplicationContext除了拥有 BeanFactory的全部功能,还有其他额外功能的实现,如国际化,资源访问以及事务传播方面等功能的支持。
3.它们两加载Bean的机制也是不同的,BeanFactory按需加载Bean,属于懒汉方式,使用它程序启动快,在后期获取对象时会慢一些;而ApplicationContext是饿汉方式,在创建时会将一次性将所有的Bean都加载,这种方式启动慢,启动之后获取对象就非常快了。
4.ApplicationContext 是BeanFactory的子类,继承了BeanFactory 的方法和属性,功能更加强大,也是现今相对于BeanFactory 更推荐使用的。而BeanFactory 属于是旧版本的产物,目前已经不建议使用。
总结
结束语
Spring是一个强大而灵活的框架,它可以帮助我们解决Java开发中的各种挑战。通过深入理解和掌握Spring的核心特性和主要模块,我们可以更加高效地进行Java开发,提高代码的质量和复用性。让我们一起探索Spring的世界,享受Java开发的乐趣吧!