如果要深入了解spring的原来,那么最先了解得就应该是spring容器。Spring提供了两种类型的IOC容器实现:
1.beanFactory: IOC 容器的基本实现。
2.ApplicationContext: 提供了更多的高级特性,是beanFactory的子接口。
在spring的应用中,经常见到的代码就是如下典型的从容器中获取bean实例的代码:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
OrderService service = (OrderService)ctx.getbean("personService");
第一行代码就是创建一个IOC容器的实例。BeanFactory、ApplicationContext只是接口,在应用中,需要实例化其实现类。ApplicationContext实现类有以下三种是经常要用到的:
ClassPathXmlApplicationContext: 从 classpath 下加载配置文件
FileSystemXmlApplicationContext: 从文件系统中加载配置文件
XmlWebApplicationContext: 只能用于 web 应用
无论使用何种方式, 配置文件时相同的。但是由于ApplicationContext提供了更多的附加功能,比如它提供了文本信息解析工具、载入资源的通用方法等等,所以使用的时候大部分都是用该接口。在web应用中通常都是通过ClassPathXmlApplicationContext去类路径下加载配置文件,生成一个IOC容器并管理配置文件中配置的bean。
Spring提供了强大的IOC容器来管理组成应用程序中的bean(组件)。要利用容器提供的服务,就必须配置bean,让这些bean运行在Spring IOC容器中。为了让Spring IOC 容器能够对bean进行实例化,每个bean 都应该提供一个唯一的名称和一个全限定类名。例如下面三种方式实例化bean:
1.使用类构造器实例化
<bean id="orderService" class="cn.itcast.OrderServiceBean"/>
2.使用静态工厂方法实例化
<bean id="personService" class="cn.itcast.service.OrderFactory" factory-
method="createOrder"/>
public class OrderFactory {
public static OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
3.使用实例工厂方法实例化:
<bean id="personServiceFactory" class="cn.itcast.service.OrderFactory"/>
<bean id="personService" factory-bean="personServiceFactory" factory-
method="createOrder"/>
public class OrderFactory {
public OrderServiceBean createOrder(){
return new OrderServiceBean();
}
}
第一种方法,IOC容易直接根据配置文件中的class属性通过反射创建一个实例,使用的是该类的默认构造方法。第二种则是调用class指定的工厂类的工厂方法,来返回一个相应的bean实例,值得注意的是工厂类的方法是静态方法,所以不用产生工厂本身的实例。而第三种则不同,它除了配置与第二种相同外,唯一的不同就是方法不是静态的,所以创建bean的实例对象时需要先生成工厂类的实例。
实例了bean对象时,需要对其中的属性也进行赋值,这时就是经常被提及的依赖注入。对bean的每个简单类型的属性来说,可以为其制定<value>元素。Spring会尝试将值转换为该属性的声明类型。比较常用的有:
1.setter注入使用<property>元素,使用name属性指定bean的属性名称。优点: setter 方法可以自动生成,简单。缺点: 组件使用者或许会忘记给组件注入它需要的依赖; 在第一次注入后,依赖可能会因为 setter 方法的调用而被修改。
2.构造器注入在 <constructor-arg>元素里声明属性,因为构造器的参数是基于位置的, 所以<constructor-arg>中没有name属性。优点: 解决了setter注入的缺点。缺点: 需通过参数位置来确定参数; 若组件有多个依赖需要注入, 会导致构造器参数列表非常冗长。
IOC容器里可能会声明很多的bean,这些bean之间的依赖关系通常会比较复杂。使用setter注入并不能保证属性一定会被注入。spring通过依赖检查来检查属性:
1.Spring 的依赖检查特性可以检查bean上的某些类型的所有属性是否被设置。
2.Spring 的依赖检查特性只需在<bean>的dependency-check 属性里指定依赖检查模式即可。
3.Spring 的依赖检查特性只能检查属性是否被设置,但对设置的属性值是 null 的情况则无能为力。
4.Spring 的依赖检查特性只对属性是否通过 setter 方法设置进行检查。 所以, 即使通过构造器
注入,依然会抛出异常。
以上是通过配置文件来检查,另外一种方式就是通过@Required注解检查属性。Spring的依赖检查特性只能检查某些类型的所有属性。不能只针对个别属性进行检查。
RequiredAnnotationbeanPostProcessor 是Spring的bean后置处理器,它检查所有具有@Required注解的属性是否已被设置。bean后置处理器是一种特殊类型的Spring bean,它能够在每个bean实例化后执行一些额外的工作。要激活bean后置处理器来进行属性检查,必须在Spring IOC容器里注册它。
RequiredAnnotationbeanPostProcessor只能检查属性是否被设置,但对设置的属性值是 null 的情况则无能为力。
分享到:
相关推荐
然而,在某些情况下,我们可能需要在非Spring注解的类中访问Spring容器中的Bean,或者在这些类中使用YAML配置文件中的配置信息。本篇将详细介绍如何在这样的场景下实现这一目标。 首先,让我们来理解如何在非Spring...
spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听;spring容器启动和关闭时事件监听
标题中的“Spring简单模拟Spring容器”意味着我们将探讨Spring框架的核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),以及如何通过编程方式模拟Spring容器的工作原理。...
Spring容器是Spring框架的核心组成部分,它负责管理对象的生命周期和对象间的依赖关系。在Java开发中,Spring容器(也称为ApplicationContext或BeanFactory)扮演着重要角色,它通过控制反转(Inversion of Control,...
本主题将深入探讨“简单Spring容器实现”,基于提供的标签“源码”和“工具”,我们将聚焦于Spring容器的原理及其简易实现。下面,我们先来理解Spring容器的核心概念,然后逐步探索其内部机制,并通过一个名为...
基于接口、抽象类实现不停机动态调整代码的目的,将修改后的源码文件放置于指定目录下,读取文件后执行动态编译方法,即可将该类重新加载,新的类可以在Spring容器从新注册,且仅在当前窗口生效。如果重启了服务或...
Spring容器是Spring框架的核心组成部分,它负责管理对象的生命周期和对象之间的依赖关系。Spring容器的主要职责是读取配置元数据,创建和组装Bean,并提供Bean的完整生命周期管理。本篇内容将深入探讨Spring容器的...
"深度解析spring容器管理bean"这一主题,旨在深入理解Spring如何通过反射机制、依赖注入(DI)以及XML或Java配置来实现对Bean的生命周期管理。 首先,Spring容器主要有两种类型:DefaultListableBeanFactory和...
### 获取Spring容器的方法详解 在Java开发中,Spring框架因其强大的依赖注入(Dependency Injection, DI)和面向切面编程(Aspect Oriented Programming, AOP)功能而被广泛使用。掌握如何获取Spring容器对于管理和...
本实例将带你深入理解Spring容器的基本使用,通过实际操作来帮助你快速上手。 1. **Spring容器概述** Spring容器是Spring框架的核心,负责管理对象的生命周期和依赖关系。主要有两种类型的容器:BeanFactory和...
BeanFactoryPostProcessor接口是Spring框架提供的一个接口,用于扩展Spring容器的功能。该接口只有一个方法`postProcessBeanFactory`,该方法在容器加载完成之后被调用,可以用来改变容器中的配置或做一些初始化工作...
初始化和销毁方法在 Spring 容器中,我们可以通过配置来指定 Bean 在被创建后或销毁前需要执行的方法。这些方法可以用于执行初始化设置或者清理工作。 3.1. 初始化方法当我们想要在 Bean 创建完成后执行特定的初始...
### 获取Spring容器的相关知识点 #### 一、Spring容器简介 Spring框架的核心是其IoC容器,也称为Spring容器。Spring容器负责管理应用对象的生命周期、配置以及装配过程。Spring提供了两种主要类型的容器: 1. **...
Spring容器中IOC Spring容器中IOC(Inverse of Control,控制反转)是Spring框架的核心功能之一。IOC容器是Spring Framework的核心组件之一,负责管理应用程序中的对象实例,控制对象的生命周期,并提供依赖注入的...
### Spring容器研究 #### 一、依赖注入 依赖注入(Dependency Injection, DI)是一种软件设计模式,用于降低组件间的耦合度。通过依赖注入,组件之间的依赖关系可以在运行时由容器来决定,而不是在编译期间硬编码...
Spring容器是Spring框架的核心组成部分,它负责管理和控制应用程序中的对象,这些对象被称为Bean。Spring容器主要有两种接口形式:BeanFactory和ApplicationContext,后者是前者的子接口。这两种接口都是用来表示...
Spring容器是Spring框架的核心组成部分,它负责管理对象的生命周期和对象之间的依赖关系。在这个自己实现的简单Spring容器项目中,我们可以深入理解Spring的核心原理,并学习如何构建一个基础的依赖注入(Dependency...
在Spring框架中,自动扫描(Auto-Component Discovery)是一种便捷的方式,它允许开发者无需显式配置每个bean,就能将类路径下(classpath)的特定包及其子包中的组件(即带有特定注解的类)纳入Spring容器进行管理...
- 使用`PlatformTransactionManager`接口的实现,如`DataSourceTransactionManager`,并将其注册到Spring容器中。 5. **扫描Mapper接口** - 通过`MapperScannerConfigurer`或`@MapperScan`注解,扫描包含MyBatis ...
在Spring源代码解析的第一部分,我们将聚焦于IOC容器,特别是BeanFactory接口,它是所有Spring容器的基础。 BeanFactory接口是Spring的基石,它定义了基本的容器操作,如获取Bean、检查Bean是否存在、确定Bean的...