Spring-BeanFactory解读

简介: Spring-BeanFactory解读

BeanFactory和ApplicationContext


Spring通过一个配置文件描述Bean和Bean之间的依赖关系,利用Java反射功能实例化Bean,并建立Bean之间的依赖关系。


Spring的IOC容器在完成这些底层工作的基础上,还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、资源装载等高级服务。


BeanFactory是Spring框架最核心的接口,它提供了高级IOC的配置机制。


ApplicationContext建立在BeanFactory的基础上,提供了更多面向应用的功能, 它提供了国际化支持和框架事件体系。


我们一般称BeanFactory为IoC容器,而称ApplicationContext为应用上下文,但有时候为了行文方便,我们也将ApplicationContext称为Spring容器。


对于BeanFactory 和 ApplicationContext的用途:


BeanFactory是Spring框架的基础设施,面向Spring本身

ApplicationContext面向使用Spring框架的开发者,几乎所有的应用场合都可以直接使用Application而非底层的BeanFactory.


BeanFactory概述


BeanFactory是一个类的通用工厂,可以创建并管理各种类的对象。

这些被创建和管理的对象,并无特别之处,仅仅是一个POJO,Spring称这些被创建和管理的Java对象为bean.

所有可以被Spring容器实例化并管理的Java类都可以成为Bean。


解读BeanFactory的类体系结构


20170710115012538.jpg

20170710114906773.jpg


20170710115319703.png

BeanFactory的主要方法是 getBean(String beanName). 该方法从容器中返回特定名称的Bean.


BeanFactory的功能通过其他接口得到不断的扩展,主要有以下几个接口


ListableBeanFactory 定义了访问容器Bean中的若干方法。


20170710122426791.jpg


HierarchicalBeanFactory 父子级联IoC容器的接口,子容器可以通过 接口方法访问父容器

ConfigurableBeanFactory 重要接口,增强了IoC容器的可定制性

AutowireCapableBeanFactory 定义了容器中的Bean按照某种规则进行自动装配的方法

SingletonBeanRegistry 定义了允许在运行期间向容器注册单实例Bean的方法

20170710123004973.jpg


  • BeanDefinitionRegistry:Spring配置文件中的每个<bean>节点元素在Spring中通过一个BeanDefinition对象表示,它描述了Bean的配置信息,该接口提供了向容器手工注册BeanDefinition的方法。


初始化BeanFactory


20170710220057274.jpg


Plane.java

package com.xgj.master.ioc.beanfactory;
public class Plane {
    private String brand;
    private String color;
    private int maxSpeed;
    public String getBrand() {
        return brand;
    }
    public void setBrand(String brand) {
        this.brand = brand;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    public int getMaxSpeed() {
        return maxSpeed;
    }
    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }
    public void introduce(){
        System.out.println("Plane brand:" + brand + " ,Color:" + color + ",maxSpeed:" + maxSpeed);
    }
}


bean-plane.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" 
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
    <bean id="plane" class="com.xgj.master.ioc.beanfactory.Plane"
        p:brand="A380" p:color="Blue" p:maxSpeed="700" />
</beans>


BeanFactoryTest.java

package com.xgj.master.ioc.beanfactory;
import java.io.IOException;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
public class BeanFactoryTest {
    public static void main(String[] args) throws IOException {
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource resource = resolver.getResource("classpath:com/xgj/master/ioc/beanfactory/bean-plane.xml");
        System.out.println(resource.getURL());
        //BeanFactory factory = new XmlBeanFactory(resource);  被废弃,不建议使用
        DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
        XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
        reader.loadBeanDefinitions(resource);
        System.out.println("inti BeanFactory successfully");
        Plane plane = beanFactory.getBean("plane",Plane.class);
        System.out.println("Plane Bean  is ready to use");
        plane.introduce();
    }
}


20170710220235037.jpg

解读:


XmlBeanDefinitionReader 通过Resource装载Spring配置信息并启动IOC容器,然后就可以通过BeanFactory#getBean(beanName)方法从IOC容器中获取bean。


通过BeanFactory启动IOC,初始化动作发生在第一调用时。


对于单实例singleton的bean来将,BeanFactory会缓存bean实例, 所以第二次使用getBean()时,将直接从IOC容器的缓存中获取Bean实例。


Spring在DefaultSingletonBeanRegistry类中提供了一个用户缓存单实例bean的缓存器, 是一个HashMap实现的缓存器。 beanName作为键保存在map中。


20170710221142276.jpg


20170710221320367.jpg

20170710221407106.jpg

相关文章
|
存储 缓存 测试技术
微服务注册中心的原理和实现方式
【2月更文挑战第19天】注册中心可以说是实现服务化的关键,因为服务化之后,服务提供者和服务消费者不在同一个进程中运行,实现了解耦,这就需要一个纽带去连接服务提供者和服务消费者,而注册中心就正好承担了这一角色。
|
1月前
|
缓存 安全 Java
Spring Security权限管理解析
Spring Security是Spring生态中的核心安全框架,采用认证与授权分离架构,提供高度可定制的权限管理方案。其基于过滤器链实现认证流程,通过SecurityContextHolder管理用户状态,并结合RBAC模型与动态权限决策,支持细粒度访问控制。通过扩展点如自定义投票器、注解式校验与前端标签,可灵活适配多租户、API网关等复杂场景。结合缓存优化与无状态设计,适用于高并发与前后端分离架构。
153 0
|
Linux 虚拟化 Windows
Bitnami:服务器套件的云部署工具
Bitnami是一个面向服务器维护者的云服务,直接提供适用于各种Linux发行版的免配置的服务器软件安装包。其自身定位为“服务器端的软件商店”。
4975 0
Bitnami:服务器套件的云部署工具
|
Java 应用服务中间件 持续交付
SpringBoot采用Java配置类的方式配置Nacos,动态注册微服务IP
本文是采用Java配置类的方式配置微服务的Nacos服务注册,并动态的配置spring.cloud.discovery.ip属性以打到微服务内网穿透注册至Nacos注册中心。
5165 0
SpringBoot采用Java配置类的方式配置Nacos,动态注册微服务IP
|
5月前
|
Python
在VScode环境下配置Python环境的方法
经过上述步骤,你的VSCode环境就已经配置好了。请尽情享受这扇你为自己开启的知识之窗。如同你在冒险世界中前行,你的探索之路只有越走越广,你获得的知识只会越来越丰富,你的能力只会越来越强。
531 37
|
SQL 存储 API
Flink实践:通过Flink SQL进行SFTP文件的读写操作
虽然 Apache Flink 与 SFTP 之间的直接交互存在一定的限制,但通过一些创造性的方法和技术,我们仍然可以有效地实现对 SFTP 文件的读写操作。这既展现了 Flink 在处理复杂数据场景中的强大能力,也体现了软件工程中常见的问题解决思路——即通过现有工具和一定的间接方法来克服技术障碍。通过这种方式,Flink SQL 成为了处理各种数据源,包括 SFTP 文件,在内的强大工具。
396 15
|
7月前
|
XML Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
353 0
|
11月前
|
消息中间件 Java 数据库
解密Spring Boot:深入理解条件装配与条件注解
Spring Boot中的条件装配与条件注解提供了强大的工具,使得应用程序可以根据不同的条件动态装配Bean,从而实现灵活的配置和管理。通过合理使用这些条件注解,开发者可以根据实际需求动态调整应用的行为,提升代码的可维护性和可扩展性。希望本文能够帮助你深入理解Spring Boot中的条件装配与条件注解,在实际开发中更好地应用这些功能。
215 2
|
数据采集 搜索推荐 安全
智慧城市的交通管理大数据模型
智慧城市交通管理系统借助大数据模型,通过全面收集交通数据(如监控、GPS、公共交通信息等),进行数据清洗和预处理,利用Python的Pandas进行数据管理。通过ARIMA等模型分析,预测交通流量、识别交通模式,支持智能信号控制、预测性维护和事件响应。这种集成分析与决策支持系统提升城市交通效率,确保出行安全,预示着未来交通管理的智能化和个性化趋势。【6月更文挑战第23天】
1359 10
|
Android开发
Android 配置蓝牙遥控器键值
本文详细介绍了Android系统中配置蓝牙遥控器键值的步骤,包括查看设备号、配置键位映射文件(kl文件)、部署kl文件以及调试过程,确保蓝牙遥控器的按键能正确映射到Android系统对应的按键功能。
2060 1