概念

  1. BeanFactory是spring的基础类型IOC容器,提供完整的IOC服务支持
  2. 默认采用延迟初始化策略,当客户端对象访问受管对象时,才对其进行初始化和依赖注入

理解

  1. BeanFactory将每个对象看做一个bean,通过配置文件,编码,注解等方式获取组装这个bean的

    零件,最终对用户提供一个获取bean的接口
  2. 用户不用关心bean如何组装
  3. BeanFactory简化并接管了对象间复杂的依赖绑定关系,由业务对象自己去new,去拉业务对象,变成了BeanFactory来推送业务对象,用户只需使用简单的注解就可以获取对象

BeanFactory有三种方式来管理业务对象的注册和依赖绑定

代码如下:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import java.io.Serializable; /**
* @Author: Lisa
* @Date: 2018/11/12 14:15
*/
@Component
public class Student implements Serializable { private static final long serialVersionUID = 3547480842866045450L; @Value(value = "12")
private Integer id; private String name; private String sex; @Value(value = "观沧海")
private String address; private Integer age; public Student() {
}
public Student(Integer id, String name, String sex, String address, Integer age) {
this.id = id;
this.name = name;
this.sex = sex;
this.address = address;
this.age = age;
} @Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex
+ ", address=" + address + ", age=" + age + "]";
}
}

1. 注解方式

Spring会扫描到注有@Component的类,将他们添加到容器进行管理,用户通过@Autowired

注解来将它注入业务场景,@Value注解会指定初始值

  @Autowired
Student student; /**
* 注解方式
*
* @return
*/
@RequestMapping("/viaano")
public Object viaAnnotation() {
return student;
} 结果:
{
"id": 12,
"name": null,
"sex": null,
"address": "观沧海",
"age": null
}

2. 直接编码方式

不管什么方法最后都是通过编码来实现的,不过我们也可以直接进行编码

  /**
* 直接编码方式
* 把对象比作书,BeanFactory相当于图书馆,BeanDefinitionRegistry相当于书架
* @return
*/
@RequestMapping("/viacode")
public Object index() {
// 提供者
Supplier<Student> stu = () ->new Student(1,"loki","dd","saibotan",9); // 定义Bean, beanDefinition实例保存对象的所有必要信息,每个受管理的对象在容器中都有一个beanDefinition与之对应
AbstractBeanDefinition beanDefinition = new RootBeanDefinition(Student.class, stu);
BeanDefinitionRegistry registry = new DefaultListableBeanFactory(); // 将bean定义注册到容器中
registry.registerBeanDefinition("stu",beanDefinition); // 指定依赖关系,通过构造方法注入
ConstructorArgumentValues argumentValues = new ConstructorArgumentValues();
argumentValues.addIndexedArgumentValue(0, beanDefinition);
beanDefinition.setConstructorArgumentValues(argumentValues); // 可以使用了
BeanFactory beanFactory = (BeanFactory)registry; Student student = (Student)beanFactory.getBean("stu"); return student;
} 结果:
{
"id": 1,
"name": "loki",
"sex": "dd",
"address": "saibotan",
"age": 9
}

3. 配置文件方式

1. Properties文件格式

# 文件名:spring-test.properties

stu.(class)=myspringboot.springboottest.entity.Student
stu.$0=2
stu.$1=傻强
stu.$2=s
stu.$3=address
stu.$4=33 # 可参考PropertiesBeanDefinitionReader的注释文档
# 出现中文乱码时,设置IDEA的FileEncoding
# 构造函数要传入所有必要参数
  /**
* 配置文件方式1
* PropertiesBeanDefinitionReader是按Spring的文件规则进行加载,
* 可以定义并实现自己的规则来加载和解析,不过没有必要
*
* @return
*/
@RequestMapping("/viapro")
public Object viaProperties() { // BeanDefinitionReader 实现类-->读取映射配置文件到BeanDefinition-->注册到BeanDefinitionRegistry
BeanDefinitionRegistry definitionRegistry = new DefaultListableBeanFactory();
BeanDefinitionReader definitionReader = new PropertiesBeanDefinitionReader(definitionRegistry);
definitionReader.loadBeanDefinitions("classpath:spring-test.properties"); // 可以使用了
BeanFactory beanFactory = (BeanFactory)definitionRegistry; Student student = (Student)beanFactory.getBean("stu");
return student;
} 结果:
{
"id": 2,
"name": "傻强",
"sex": "s",
"address": "address",
"age": 33
}

2. 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">
<bean id="stu" class="myspringboot.springboottest.entity.Student">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="张三"></constructor-arg>
<constructor-arg name="age" value="1"></constructor-arg>
<constructor-arg name="address" value="哈哈"></constructor-arg>
<constructor-arg name="sex" value="1"></constructor-arg>
</bean> </beans>
  /**
* 配置文件方式2
* xml 支持最为完整,强大,同样可以扩展
*
* @return
*/
@RequestMapping("/viaxml")
public Object viaXml() { // BeanDefinitionReader实现类-->读取映射配置文件到BeanDefinition-->注册到BeanDefinitionRegistry
BeanDefinitionRegistry definitionRegistry = new DefaultListableBeanFactory();
BeanDefinitionReader definitionReader = new XmlBeanDefinitionReader(definitionRegistry);
definitionReader.loadBeanDefinitions("classpath:spring-test.xml"); // 可以使用了
BeanFactory beanFactory = (BeanFactory)definitionRegistry; Student student = (Student)beanFactory.getBean("stu");
return student;
} 结果:
{
"id": 1,
"name": "张三",
"sex": "1",
"address": "哈哈",
"age": 1
}

参考书籍: Spring揭秘 王福强 著

Spring中BeanFactory的对象注册与依赖绑定方式的更多相关文章

  1. spring揭秘 读书笔记 二 BeanFactory的对象注册与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,而且IoC Service Pr ...

  2. Spring中BeanFactory与FactoryBean的区别

    在Spring中有BeanFactory和FactoryBean这2个接口,从名字来看很相似,比较容易搞混. 一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层 ...

  3. 【Java面试】Spring中 BeanFactory和FactoryBean的区别

    一个工作了六年多的粉丝,胸有成竹的去京东面试. 然后被Spring里面的一个问题卡住,唉,我和他说,6年啦,Spring都没搞明白? 那怎么去让面试官给你通过呢? 这个问题是: Spring中Bean ...

  4. 【Spring】Spring中的Bean - 5、Bean的装配方式(XML、注解(Annotation)、自动装配)

    Bean的装配方式 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-Spring中的Bean 文章目录 Bean的装配方式 基于XML的装配 基于注解 ...

  5. spring中BeanFactory和FactoryBean的区别

    共同点: 都是接口 区别: BeanFactory 以Factory结尾,表示它是一个工厂类,用于管理Bean的一个工厂 在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器 ...

  6. spring中的控制反转IoC和依赖注入DI

    原文:http://blog.163.com/xianghuxian@126/blog/static/50639037200721345218382/ IoC(Inversion of Control ...

  7. 简单实现Spring中BeanFactory原理

    上一篇文章介绍了Java反射机制在Spring IOC中的应用,知道了BeanFactory底层的实现原理. 原理搞懂了,对Spring IOC理解起来也很容易. 先来看看Java代码获取Spring ...

  8. Spring中BeanFactory与FactoryBean到底有什么区别?

    一.BeanFactory BeanFactory是一个接口,它是Spring中工厂的顶层规范,是SpringIoc容器的核心接口,它定义了getBean().containsBean()等管理Bea ...

  9. spring中创建bean对象的三种方式以及作用范围

    时间:2020/02/02 一.在spring的xml配置文件中创建bean对象的三种方式: 1.使用默认构造函数创建.在spring的配置文件中使用bean标签,配以id和class属性之后,且没有 ...

随机推荐

  1. emWin酿造机过程演示,含uCOS-III和FreeRTOS两个版本

    第2期:酿造机过程演示 配套例子:V6-902_STemWin提高篇实验_酿造机过程演示(uCOS-III)V6-903_STemWin提高篇实验_酿造机过程演示(FreeRTOS) 例程下载地址:h ...

  2. 【安富莱】【RL-TCPnet网络教程】第7章 RL-TCPnet网络协议栈移植(裸机)

    第7章        RL-TCPnet网络协议栈移植(裸机) 本章教程为大家讲解RL-TCPnet网络协议栈的裸机移植方式,学习了上个章节讲解的底层驱动接口函数之后,移植就比较容易了,主要是添加库文 ...

  3. 【安富莱二代示波器教程】第17章 附件B---功能扩展和改进方向

    完整教程下载地址:http://forum.armfly.com/forum.php?mod=viewthread&tid=45785 第17章      附件B---功能扩展和改进方向   ...

  4. CS20SI-tensorflow for research笔记: Lecture1

    本文整理自知乎专栏深度炼丹,转载请征求原作者同意. 本文的全部代码都在原作者GitHub仓库github CS20SI是Stanford大学开设的基于Tensorflow的深度学习研究课程. 什么是T ...

  5. [Swift]LeetCode246.对称数 $ Strobogrammatic Number

    A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside ...

  6. [Swift]LeetCode767. 重构字符串 | Reorganize String

    Given a string S, check if the letters can be rearranged so that two characters that are adjacent to ...

  7. 发布core到linux

    1.安装虚拟机之后,发现可以ping通但是telnet提示失败 CentOS 7.0默认使用的是firewall作为防火墙(我们需要把防火墙关掉) 查看防火墙状态 firewall-cmd --sta ...

  8. 机器学习基石笔记:04 Feasibility of Learning

    原文地址:https://www.jianshu.com/p/f2f4d509060e 机器学习是设计算法\(A\),在假设集合\(H\)里,根据给定数据集\(D\),选出与实际模式\(f\)最为相近 ...

  9. JSONP和CORS两种跨域方式的优缺点及使用方法原理介绍

    随着软件开发分工趋于精细,前后端开发分离成为趋势,前端同事负责前端页面的展示及页面逻辑处理,服务端同事负责业务逻辑处理同时通过API为前端提供数据也为前端提供数据的持久化能力,考虑到前后端同事开发工具 ...

  10. Linux suse 11 sp1 安装教程

    在 VMware Workstation Pro 中打开 iso 文件,进入主界面,选择 installation : 语言选择 简体中文,键盘选择 美国US ,选择下一步,点击继续: 选择 全部安装 ...