一提到Spring,首先窜进我们脑海的想必一定是IoC了,早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”---“依赖对象的获得被反转了”,他的结论。 基于这个结论,也就出现了后来的DI(依赖注入)。对于我们长期面向对象的程序猿而言,面向对象编程中,对象的生命周期和对象之间的依赖关系的管理无疑是往往最让我们 头疼的问题,其实XWork之前也提出了“创造”出一个额外的编程元素---容器来解决这些问题,(其实也就是IoC,不过的Spring的迅速崛起,XWork也放弃在于Spring竞争开发)。
那么为什么Spring会这么大红大紫这么多年呢?我们知道在那个没有Spring的年代,如果合作对象的引用或依赖关系的管理由具体的对象来完成,代码的高度耦合和可测试 性的降低,在我们对于一个复杂业务的开发可谓是灾难性的。在面向对象编程中,对象封装了数据和对数据的处理,而对象的依赖关系常常体现在对象数据和对象方法的依赖上, 而一旦我们将依赖关系的管理交给IoC来处理,不但代码得到很好的解耦,而且对于可测试性来说也是质的飞越。
至此,Spring IoC的地位已经毋庸置疑,然而对于我们使用Spring的人来说IoC到底是什么东东呢?我们可以说BeanFactory就是我们能看到IoC容器。BeanFactory其实更 像是IoC容器的一个标准,Spring里提供了给我们行行色色的IoC容器,当然他们都是为了方便我们能够在不能资源位置、不同的层面、不同的形式的定义信息来建立我们的IoC 容器。那么首先先让我们来看看BeanFactory这个标准是怎么定义的吧:
public interface BeanFactory { //这里是对FactoryBean进行转义 如果不加“&”正常按照bean的名字 //检索FactoryBean得到的是其getObject()构造的对象 String FACTORY_BEAN_PREFIX = "&"; //根据bean的名字检索从IoC容器中得到bean的实例 Object getBean(String name) throws BeansException; //根据bean的名字和Class类型来检索bean的实例,与上面那个方法不同在于根据名字 //取到的bean和Class类型不匹配的话会抛出异常 <T> T getBean(String name, Class<T> requiredType) throws BeansException; //根据Class类型检索bean的实例 <T> T getBean(Class<T> requiredType) throws BeansException; //重载getbean(String name)方法,可变参数主要用来指定是否 //显示使用静态工厂方法创建一个原型(prototype)bean Object getBean(String name, Object... args) throws BeansException; //判断IoC容器中是否包含指定name的bean boolean containsBean(String name); //判断指定名字的bean是否是单例bean boolean isSingleton(String name) throws NoSuchBeanDefinitionException; //判断指定名字的bean是否是原型bean boolean isPrototype(String name) throws NoSuchBeanDefinitionException; //判断指定名字的bean是否匹配指定的Class类型 boolean isTypeMatch(String name, Class<?> targetType) throws NoSuchBeanDefinitionException; //根据指定的名字获取bean的Class类型 Class<?> getType(String name) throws NoSuchBeanDefinitionException; //获取指定名字bean的所有别名(alias) String[] getAliases(String name); }
正如我们所说的BeanFactory只是一个IoC容器的规范,它并不关心你是如何定位、如何加载、如何解析资源,它只是为我们定义了一个IoC的一个 基本的行为规范。这个就像是我们去商店买东西一样,我们关心的是我们买到的什么东西,我们并不关心工厂是怎么生产出这些商品的一样。 在Spring IoC的设计中,我们最常见的俩个主要容器系列是,像ListableBeanFactory、HierarchicalBeanFactory、AutowireCapableBeanFactory、 DefaultListableBeanFactory等等这些继承了BeanFactory的简单容器,另一方面,还有像ApplicationContext这样除了继承BeanFactory规范外,还 新增了像国际化、资源的访问、应用事件的支持以及其他的附加服务。相比简单的BeanFactory,ApplicationContext形式的IoC容器更便于我们开发时 作为IoC容器的基本形式。
了解了IoC容器的系列,想毕我们日常的大部分需求无出其右,接下先一睹为快BeanFactory的“家族族谱”
对于高级IoC容器,到底高端在哪呢?
显然ApplicationContext通过集成MessageSource、ResourceLoader、ApplicationEventPublisher接口,在BeanFactory的基础上 为我们提供了更加丰富多彩的功能。
在这些Spring提供的各式各样的IoC容器的基础上,Spring通过定义BeanDefinition来管理基于Spring应用中的各种对象之间的依赖关系, 其实在面向对象的编程中,所有的功能都是建立在通过数据对现实进行抽象的基础之上的。而BeanDefinition正是Spring IoC容器用来管理 这些对象之间复杂依赖关系的核心数据结构,那么BeanDefinition的继承结构是什么样的?
其实纵观整个Spring的结构,觉得分析Spring的过程就好比是在看一场演出,有宽敞的舞台(Context),表演精湛的演员(Bean),为演员提供精致的道具(Core)。 刚刚我们已经看见了这些演员的模样,那这样演员都是师从何处呢?
我们都知道,在面向对象的世界里,任何行为都需要抽象成对象的形式表现出来。在Spring的使用中,我们一般都是将对象之间的依赖关系通过xml或者properties的 形式表现出来,然后Spring会通过自己的方式将他们读取、装载形成对象,也就是我们眼前表演精湛的演员们。
然而表演再精湛的演员,他同样需要一个大的舞台(Context)来展现自己,就行我们自己一样,大家其实能力都差不多,只不过“三分能耐六分运气一份贵人扶持”... ... 最后我们再来理一理这个舞台的结构,至于 演员的道具(core)下篇继续...
其中: WebApplicationContext:为Web准备的Context,可直接访问ServletContext ConfigurableApplicationContext:该Context是可修改的Context,在构建Context时用户可以动态添加或修改已有配置
相关推荐
在预实例化过程中,`getBean(beanName)`被调用,这是`AbstractBeanFactory`类中的一个方法,用于从Bean工厂中获取指定名称的Bean实例。 6. **实际获取Bean**: 进入`doGetBean()`方法,这是Bean实例化的关键步骤...
在Spring配置文件中,我们需要定义一个工厂bean,然后指定该工厂bean的`factory-bean`属性,以及工厂bean中用于创建目标bean的方法,即`factory-method`属性。下面是一个简单的例子: ```xml <bean id="myFactory...
综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂方法的误用、AOP代理的配置问题或是Bean作用域设置不准确导致的。通过仔细检查和修正这些问题,可以避免...
### Spring Bean 属性详解 Spring框架是Java平台上的一个开源框架,主要用来简化企业级应用程序的开发。在Spring中,核心概念之一就是Bean,它是一个简单的Java对象,由Spring IoC容器管理。Spring通过XML配置文件...
在Spring中,Bean的管理包含多个方面:创建Bean实例、配置Bean属性、控制Bean的生命周期以及Bean作用域的定义。接下来将详细解释这些知识点。 1. Spring的工厂类: Spring通过工厂模式设计了一系列工厂类来创建对象...
实例化完成后,如果有Bean实现了BeanNameAware等Aware接口,则会调用相应的方法来设置Bean工厂、类加载器等信息。接着,Spring容器会调用实现了BeanPostProcessor接口的Bean的postProcessBeforeInitialization和...
在Spring框架中,Bean工厂是核心组件之一,它负责管理所有Bean的生命周期,包括实例化、配置、装配以及销毁。本章将详细分析Spring 5.2.9版本中Bean工厂的准备工作,特别是通过测试用例来理解其实现细节。 在Spring...
1. **根元素**:`<beans>`是配置文件的根元素,用于声明一个Spring Bean工厂。 - `xmlns`属性指定了命名空间,用于识别特定的功能模块,如`xmlns:context`、`xmlns:aop`等。 - `xmlns:xsi`和`xsi:schemaLocation`...
Spring支持多种实例化方式,如无参构造器、工厂方法、静态工厂方法等。默认情况下,Spring使用无参构造器创建Bean实例。 3. **属性注入** 实例化后的Bean,Spring会根据配置信息注入依赖。这可以通过属性值、构造...
1. **实例化**:Spring容器通过无参构造函数或工厂方法创建Bean实例。如果配置了`@Scope("prototype")`,每次请求都会创建一个新的Bean。 2. **属性注入**:Spring容器将根据Bean定义中的属性值、setter方法或构造...
在Spring框架中,"工厂Bean"是一个非常关键的概念,它扩展了传统的Bean定义,使得我们可以在Spring IoC容器中创建自定义的实例化逻辑。工厂Bean允许开发者在对象实例化时进行更复杂的控制,比如引入特定的初始化过程...
1. **实例化**:这是生命周期的第一步,Spring通过反射或者工厂方法来创建Bean的实例。根据`<bean>`标签中的`class`属性,Spring确定Bean的类型并进行实例化。 2. **属性注入**:接着,Spring会利用依赖注入...
07 源码分析-spring的bean工厂准备工作
1. **SqlSessionFactoryBean**: 这是一个 Spring Bean 工厂,用于创建 SqlSessionFactory。它允许你在 Spring 配置中设置 MyBatis 的配置文件、数据源以及其他相关属性,使得配置更加灵活。 2. **...
4. **使用阶段**:Bean现在可以在应用中被正常使用,每次请求时,Spring都会从Bean工厂中获取Bean实例。 5. **销毁阶段**:当应用关闭或Bean不再需要时,Spring会调用销毁方法。可以通过`@PreDestroy`注解的方法,...
10. **Aware接口**:Spring提供了一系列的Aware接口,如BeanNameAware、BeanFactoryAware和ApplicationContextAware,这些接口使得Bean可以在运行时获取自身的一些信息,例如Bean的名字、所处的Bean工厂或...
- **Bean工厂**:Spring Bean工厂是创建应用对象的工厂,负责实例化、配置以及管理应用程序中对象的生命周期。Spring的Bean工厂与传统Java Bean不同,它支持依赖注入。 #### Spring Context - **应用上下文...
在项目中创建`hivemodule.xml`文件并定义一个服务实现,例如`DefaultSpringBeanFactoryHolder`,这将提供一个新的Spring Bean工厂持有者。 ```xml service-id="hivemind.lib....
关于`模拟Spring Bean工厂练习`,这可能是指通过编程方式模拟Spring框架中的Bean工厂,Spring框架使用IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入)的概念,其中工厂模式是其核心。...
Bean工厂是Spring容器的核心,负责管理Bean的生命周期和依赖注入。在本例中,我们将创建一个自定义的Bean工厂,它将利用动态代理来增强Bean的行为。 1. **创建目标对象(Target Object)**:这是我们要添加AOP逻辑...