前言
本文为 【Spring】Spring IOC容器 相关知识,首先为大家介绍Spring IOC相关的名词概念,对Spring IOC进行概述,然后具体为大家介绍配置元数据
,容器实例化与使用
等Spring IOC相关详尽内容~
📌博主主页:小新要变强 的主页
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~
👉Java微服务开源项目可参考:企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)
目录
【Spring】Spring IOC容器
- 前言
- 目录
- 1️⃣IOC概述
- 2️⃣配置元数据
- 3️⃣容器实例化与使用
- 后记
在学习IOC 容器之前首先需要了解一些常见的名词:
- 容器: 可以管理对象的生命周期、对象与对象之间的依赖关系。
- POJO: POJO(Plain Old Java Object)这种叫法是Martin Fowler、Rebecca Parsons和Josh MacKenzie在2000年的一次演讲的时候提出来的。按照Martin Fowler的解释是“Plain
Old Java
Object”,从字面上翻译为“纯洁老式的Java对象”,但大家都使用“简单java对象”来称呼它。POJO的内在含义是指:那些没有继承任何类、也没有实现任何接口,更没有被其它框架侵入的java对象。不允许有业务方法,也不能携带connection之类的方法,实际就是普通JavaBeans。
JavaBean: JavaBean是一种JAVA语言写成的可重用组件。JavaBean符合一定规范编写的Java类,不是一种技术,而是一种规范。大家针对这种规范,总结了很多开发技巧、工具函数。符合这种规范的类,可以被其它的程序员或者框架使用。它的方法命名,构造及行为必须符合特定的约定:(1)所有属性为private;(2)这个类必须有一个公共的缺省构造函数。即是提供无参数的构造器;(3)这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范;(4)这个类应是可序列化的。实现serializable接口;(5)因为这些要求主要是靠约定而不是靠实现接口,所以许多开发者把JavaBean看作遵从特定命名约定的POJO。 - POJO与Java Bean的区别:
POJO | JAVABean |
---|---|
除了Java语言强加的限制外,它没有其他特殊限制。 | 这是一个特殊的POJO,它有一些限制。 |
它没有对成员提供太多控制。 | 它提供对成员的完全控制。 |
它可以实现Serializable接口。 | 它应该实现可序列化的接口。 |
可以通过字段名称访问字段。 | 字段只能由getter和setter访问。 |
字段可以具有任何可见性。 | 字段只有私人可见性。 |
可能/可能没有no-arg构造函数。 | 它必须具有无参数构造函数。 |
当您不想限制成员并让用户完全访问您的实体时使用它。 | 当您要向用户提供您的实体,但仅向实体的一部分提供服务时,将使用它。 |
POJO类和Bean均用于定义Java对象,以提高其可读性和可重用性。POJO没有其他限制,而bean是具有某些限制的特殊POJO。
- SpringBean: SpringBean是受Spring管理的对象,所有能受Spring容器管理的对象都可以成为SpringBean。Spring中的bean,是通过配置文件、javaconfig等的设置,由Spring自动实例化,用完后自动销毁的对象。
- SpringBean和JavaBean的区别: (1)用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处不在,任何组件都可以被称为bean;(2)写法不同:传统javabean作为值对象,要求每个属性都提供getter和setter方法;但spring中的bean只需为接受设值注入的属性提供setter方法;(3)生命周期不同:传统javabean作为值对象传递,不接受任何容器管理其生命周期;spring中的bean有spring管理其生命周期行为。
- Entity Bean: Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity
Bean对象相当于新建一条记录,删除一个 Entity Bean会同时从数据库中删除对应记录,修改一个Entity
Bean时,容器会自动将Entity Bean的状态和数据库同步。
1️⃣IOC概述
🍀编写spring代码,我们需要创建一个maven工程,并加入以下依赖:
<!-- Spring的核心组件 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.2.18.RELEASE</version>
</dependency>
<!-- SpringIoC(依赖注入)的基础实现 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.18.RELEASE</version>
</dependency>
<!--Spring提供在基础IoC功能上的扩展服务,此外还提供许多企业级服务的支持,如邮件服务、任务调度、JNDI定位、EJB集成、远程访问、缓存以及各种视图层框架的封装等 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.18.RELEASE</version>
</dependency>
🍀本章将介绍Spring框架实现控制反转(IoC)的原理, IoC也称为依赖注入(DI)
org.springframework.beans
和org.springframework.context
包是Spring框架的IoC容器的基础。
BeanFactory接口提供了一种高级的配置机制,能够管理任何类型的对象。
ApplicationContext是BeanFactory的子接口。 它对BeanFactory进行了补充:
- (1)更容易与Spring的AOP特性集成 。
- (2)消息资源处理(用于国际化) ,解析消息的能力,支持国际化。继承自MessageSource接口。
- (3)事件发布,向注册侦听器发布事件的能力。继承自ApplicationEventPublisher接口。
- (4)应用程序层特定的上下文,如WebApplicationContext用于web应用程序。
- (5)以通用方式加载文件资源的能力,继承自org.springframe .core.io.ResourceLoader接口。
🍀beanFactory和ApplicationContext接口展示如下:
public interface BeanFactory {}
public interface ApplicationContext
extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {}
简而言之,BeanFactory提供了容器的基本功能,而ApplicationContext添加了更多特定于企业的功能。 ApplicationContext是BeanFactory的一个完整超集,仅在本章描述Spring的IoC容器时使用。
在Spring中,由Spring IoC容器【管理】的构成【应用程序主干的对象】称为【bean】。 bean是由Spring IoC容器实例化、组装和管理的对象。 否则,bean只是应用程序中的众多对象之一。 bean及其之间的依赖关系反映在容器使用的【配置元数据】中。
【applicationcontext】接口表示Spring IoC容器,并负责实例化、配置和组装bean。 容器通过读取配置元数据获得关于要实例化、配置和组装哪些对象的指令。 配置元数据以XML、Java注解或Java代码表示。 它允许您表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。
Spring提供了ApplicationContext接口的几个实现。
在独立应用程序中,创建ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的实例是很常见的。 虽然XML一直是定义配置元数据的传统格式,但您可以通过提供少量的XML配置以声明方式支持这些额外的元数据格式,指示容器使用Java注解或代码作为元数据格式。
2️⃣配置元数据
构建【Spring IoC容器】可以通过构建配置元数据的方式。 这个【配置元数据】说的是:作为应用程序开发人员,您要告诉Spring容器如何去【实例化、配置和组装】应用程序中的对象。 【元数据】传统上以简单而直观的XML格式提供,本章的大部分内容都使用这种格式来传达Spring IoC容器的关键概念和特性。
下面的示例展示了基于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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
- ’ id ’ 属性是标识单个beanDifination的字符串。
- ’ class ’ 属性定义bean的类型,并使用完全限定的类名。
3️⃣容器实例化与使用
🍀实例化一个容器
ApplicationContext 的构造函数可以是【xml文件的位置路径】的字符串,他允许容器从各种外部资源(如本地文件系统、Java的 'CLASSPATH ’ 等)加载配置元数据。
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
下面的示例显示了服务层对象(services.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- services -->
<bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
<property name="accountDao" ref="accountDao"/>
<property name="itemDao" ref="itemDao"/>
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for services go here -->
</beans>
下面的例子展示了数据访问对象(dao.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="accountDao"
class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
<!-- additional collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions for data access objects go here -->
</beans>
🍀容器的使用
【ApplicationContext】是一个高级工厂的接口,它维护了一个bean的注册列表,保存了容器产生的所有bean对象。 通过使用方法T getBean(String name, Class<T> requiredType)
,您可以检索bean的实例。
【ApplicationContext】允许你读取和访问bean,如下面的示例所示:
// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
// retrieve configured instance,这里使用bean的标识符活class对象检索bean的事例。
PetStoreService service = context.getBean("petStore", PetStoreService.class);
// use configured instance
List<String> userList = service.getUsernameList();
后记
👉Java全栈学习路线可参考:【Java全栈学习路线】最全的Java学习路线及知识清单,Java自学方向指引,内含最全Java全栈学习技术清单~
👉算法刷题路线可参考:算法刷题路线总结与相关资料分享,内含最详尽的算法刷题路线指南及相关资料分享~