初学JAVA项目(11、Ada银行-2)

  • 前言
  • 一、Ada银行-3
    • 1.什么是IOC?
    • 2.Spring IoC核心流程

前言

本次项目学习目标:
主要通过以项目为导向学习spring boot 框架


一、Ada银行-3

1.什么是IOC?

控制反转(Inversion of Control)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题。
     它还有一个名字叫做依赖注入(Dependency Injection)。
     IoC不是什么技术,它是一种设计模式。通俗理解就是将接口的具体实现类的控制权从调用类中分离转交给第三方决定。
在 Spring 中有专门的一个容器来创建和管理这些对象,并将对象依赖的其他对象注入到该对象中,这个容器我们一般称为 IoC 容器。
IOC和DI描述的是一件事情,只是从不同的角度来描述:

  • IOC控制反转:说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际上就是我们现在说的第三方,侧重于原理。
  • DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现。

BeanFactory

BeanFactory作为最顶层的一个接口类,它定义了IOC容器的基本功能规范,BeanFactory里面只对IOC容器最基本的行为做了定义,而不关心Bean是怎样定义和加载的。

如果我们想要知道一个工厂具体生产对象的过程,就需要去看这个接口的实现类。 我们可以发现最终的默认实现类是 DefaultListableBeanFactory,他实现了所有的接口。

BeanFactory 有三个子类:ListableBeanFactory、HierarchicalBeanFactory 和AutowireCapableBeanFactory。

为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场合。

它主要是为了区分在 Spring 内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的限制。

例如 ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这四个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为.

IoC 在 Spring 里,只需要低级容器(BeanFactory)就可以实现,两个步骤:

  1. 加载配置文件,解析成 BeanDefinition 放在 Map 里。
  2. 调用 getBean 的时候,从 BeanDefinition 所属的 Map 里,拿出 Class
    对象进行实例化,同时,如果有依赖关系,将递归调用 getBean 方法 —— 完成依赖注入。 FactoryBean

一般情况下,我们将 bean 的创建和管理都交给 Spring IoC 容器,Spring 会利用 bean 的 class 属性指定的类来实例化 bean。

但是如果我们想自己实现 bean 的创建操作,FactoryBean 就可以实现这个需求。

FactoryBean 是一种特殊的 bean,它是个工厂 bean,可以自己创建 bean 实例,如果一个类实现了 FactoryBean 接口,则该类可以自己定义创建实例对象的方法,只需要实现它的 getObject() 方法即可。

Beandefinition


在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。
bean 是一个由 Spring IoC 容器实例化,组装和管理的对象。

Bean对象在Spring实现中是以BeanDefinition来描述的,用来存储 bean 的所有属性方法定义。
对loC容器来说,它为管理POJO之间的依赖关系提供了帮助,但也要依据Spring的定义规则提供Bean定义信息。

我们可以使用各种形式的Bean定义信息。

  • 方法一:基于XML的bean定义(需要提供setter方法)
<?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="student" class="test.Student"><property name="name" value="a"/><property name="teacher" ref="teacher"/></bean><bean id="teacher" class="test.Teacher"><property name="name" value="b"/></bean></beans>
  • 方法二:基于注解的bean定义(不需要提供setter方法)

Spring为此提供了注解,这些注解的作用与XML定义bean效果一致,在于将组件交给Spring容器管理。组件的名称默认是类名(首字母变小写),也可以自己修改:

  1. @Component:当对组件的层次难以定位的时候使用这个注解
  2. @Controller:表示控制层的组件
  3. @Service:表示业务逻辑层的组件,相当于告诉 IoC 容器:这个类你需要帮我创建和管理
  4. @Repository:表示数据访问层的组件
  5. @AutoWire:相当于告诉 IoC 容器:我需要依赖这个类,你需要帮我注入进来。

基于Java类的bean定义(需要提供setter方法)

@Configuration
public class BeansConfiguration {@Beanpublic Student student(){Student student=new Student();student.setName("a");student.setTeacher(teacher());return student;}@Beanpublic Teacher teacher(){Teacher teacher=new Teacher();teacher.setName("b");return teacher;}}

BeandefinitionReader

Bean 的解析过程非常复杂,功能被分的很细,因为这里需要被扩展的地方很多,必须保证有足够的灵活性,以应对可能的变化。
Bean 的解析主要就是对 Spring 配置文件的解析。

ApplicationContext

ApplicationContext:BeanFactory 的子接口,在 BeanFactory 的基础上构建,是相对比较高级的 IoC容器实现。包含 BeanFactory 的所有功能.

除了能够提供IoC容器的基本功能外,还为用户提供了以下的附加服务。

  1. 支持不同的倌息源。我们看到ApplicationContext扩展了MessageSource接口,这些信息源的扩展功能可以支持国际化的实现,为开发多语言版本的应用提供服务。
  2. 访问资源。这一特性体现在对ResourceLoader和Resource的支持上,这样我们可以从不同地方得到Bean定义资源。这种抽象使用户程序可以灵活地定义Bean定义信息,尤其是从不同的途径得到Bean定义信息。这在接口关系上看不出来,不过一般来说,具体ApplicationContext都是继承了DefaultResourceLoader的子类。因为DefaultResourceLoader是AbstractApplicationContext的基类,关于Resource在loC容器中的使用,后面会有详细的讲解。
  3. 支持应用事件。继承了接口ApplicationEventPublisber,从而在上下文中引入了事件机制。这些事件和Bean的生命周期的结合为Bean的管理提供了便利。
  4. 在ApplicationContext中提供的附加服务。这些服务使得基本IoC容器的功能更丰富。因为具备了这些丰富的附加功能,使得ApplicationContext与简单的BeanFactory相比,对它的使用是一种面向框架的使用风格,所以一般建议在开发应用时使用ApplicationContext作为IoC容器的基本形式。

2.Spring IoC核心流程

IoC容器的初始化包括BeanDefinition的Resource定位、载入和注册这三个基本的过程:

  1. 创建Ioc配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息
  2. 创建一个BeanFactory,可以使用DefaultListableBeanFactory,根据配置的路径,读取 Spring
    配置文件,并封装成 Resource
  3. 创建一个载入BeanDefinition的读取器,可以使用XmlBeanDefinitionReader来载入XML文件形式的BeanDefinition
  4. 然后将上面定位好的Resource,通过一个回调配置给BeanFactory
  5. 从定位好的资源位置读入配置信息,具体的解析过程由XmlBeanDefinitionReader完成
  6. 完成整个载入和注册Bean定义之后,需要的Ioc容器就初步建立起来了

初学JAVA项目(11、Ada银行-3)相关推荐

  1. 初学JAVA项目(五、取名背后的秘密)

    初学JAVA项目(五.取名背后的秘密) Java 新生儿取名背后的数据可视化 前言 一.取名背后的秘密 二.关于一些问题的学习 1.Java中如何进行函数式编程? 1.1 什么是函数式编程? 1.2 ...

  2. java项目之Bank银行代码

    文中所有代码来自尚硅谷宋红康老师的Java课程,如有侵权请联系删除. 项目说明: 模拟实现一个基于文本界面的<客户信息管理软件>. 该软件能够实现对客户对象的插入.修改和删除(用数组实现) ...

  3. java pkcs#11读取证书加解密(初学-分享)

    java pkcs#11读取证书加解密(初学-分享) http://www.cnblogs.com/sunfb/archive/2013/02/28/2937227.html 插入USB-KEY, 想 ...

  4. eclipse 如何关联git_作为一名初学Java者 如何做简单的Java项目

    作为一名初学Java者而言,如何做简单的Java项目?想要更有效率的学习Java技术,理论中穿插项目练习很有必要.但项目练习要在你掌握了一定的技术之后才能做的,它是用来加深你对技术理解的. 就拿Jav ...

  5. JAVA初学(七):银行账户演示程序【改进版】

    一.编程说明 在上一篇博客中,笔者通过Scanner实现了由键盘对银行账户的控制,虽说直观性更强一些,但是复杂度也增加了不少,甚至造成最后编出的代码有点离题的意思.因此在借鉴了网上的代码并加以自己的理 ...

  6. java web项目网上银行_网上银行java项目源代码(含最终文档)超棒!

    [实例简介] 网上银行java项目源代码(含最终文档) 超棒!绝对让你满意... [实例截图] [核心代码] 3009218016万冠 └── 3009218016万冠 ├── webBank │   ...

  7. java毕业设计——基于java+eclipse+sqlserver的银行帐目管理系统设计与实现(毕业论文+程序源码)——银行帐目管理系统

    基于java+eclipse+sqlserver的银行帐目管理系统设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+eclipse+sqlserver的银行帐目管理系统设计与实现, ...

  8. 初学Java常用设计模式之——工厂模式

    声明:转载请附上原文链接 提示:标题序号从2开始,是照应不同设计模式笔记发布的顺序而定的,比如,第上一篇文章 初学Java常用设计模式之--单例模式 序号从1开始 2. 工厂模式(常用) ⼯⼚模式介绍 ...

  9. 自学Java-day01(初学Java)

    Java第一章 一.Java 可以做什么? 二.什么是程序? 三.Java 起源与演变 3.1.起源 3.2.演变 四.Java 体系与特点 五.Java 的特性 六.Java 跨平台原理 七.Jav ...

  10. 初学Java (不要再删了!!!)

    前言 这是我学Java时的作业.大概用了半个月时间.之前写出来一篇篇放到QQ空间,现在总结到一块.内容很多,都是Java基础内容.有很多写好的代码.有个朋友请教Java内容.我就把作业给她看,备她使用 ...

最新文章

  1. oracle学习总结三(bulk collect用法)
  2. jQuery实现id模糊查询
  3. 用g.raphael.js高速绘制饼图、柱状图、点状图、折线图(下)
  4. 树莓派cpu检测_【树莓派3B+测评】线程的挂起与恢复CPU温度检测
  5. 【Linux服务器初上手】MobaXterm/系统版本/hostname/hosts/yum源配置/jdk/docker(不断完善)
  6. Zabbix实战-简易教程--订阅类
  7. JVM常见垃圾收集器
  8. SUSE12SP3-Mycat(2)Schema.xml配置详解
  9. 40vf什么意思_LED 的基本术语VF、IV、WL、IR 解释及光通量换算关系
  10. html去掉右侧滚动条,html中去掉textarea右侧滚动条和右下角拖拽
  11. GitHub常用优秀开源Android项目
  12. Qt实现桌面右下角弹窗
  13. 用Firefox看CHM电子书
  14. 【树莓派】更新树莓派SD卡测速一键脚本,SD卡读写速度测试
  15. 计算机时间小于会计期间错误,会计期间手工记账和电脑记账不一样问题
  16. Vue中利用moment.js(时间格式化插件)做一个倒计时组件
  17. java 假设检验_Spark机器学习-Java版(二)-相关系数和假设检验
  18. drill apache_Apache Spark与Apache Drill
  19. 修改母版中页面的Title
  20. 软件畅想:英文阅读器

热门文章

  1. 效率神器----WOX
  2. Au 效果器详解:自适应降噪
  3. 如何通过组策略来缓解打印机后台处理程序漏洞CVE-2021-34527?
  4. 鸿蒙初开三界未立,太子长琴
  5. APP稳定性测试工具fastbot(字节开源项目)
  6. ubuntu系统Firefox浏览器B站视频无法播放
  7. 树莓派4B搭建NAS系统(Samba)
  8. vue+element中多选框选一个然而就全部选中了
  9. 转 八部众---走出软件作坊:三五个人十来条枪 如何成为开发正规军(二十三)
  10. PS如何快速完整的抠头发丝,请看详细的教程