Spring_总结_02_依赖注入
一、前言
本文承接上一节:Spring_总结_01_Spring概述
在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。
这一节我们开始了解Spring的第二大原则中的依赖注入,这属于六大模块中的核心容器部分。
二、基本概念
1.什么是依赖注入
(1)我们经常说的控制反转(Inversion of Control —IOC)和依赖注入(Dependency Injection—DI),在Spring 环境下是等同的概念。
(2)控制反转是通过依赖注入实现的。
(3)所谓依赖注入指的是容器负责创建对象和维护对象间的依赖关系。而不是通过对象本身负责自己的创建和解决自己的依赖。
2.依赖注入的本质
创建应用对象之间协作关系(依赖)的行为通常称为装配。这也是依赖注入的本质。
3.依赖注入主要目的
依赖注入的主要目的是解耦。
因为通过装配,对象间的依赖关系不再由对象维护,而是交给容器维护,降低了耦合度。
耦合具有两面性:
(1)紧密耦合的代码难以测试,难以复用,难以理解,并典型地表现出“打地鼠”式的bug特性。
(2)一定程度的耦合又是必须的——完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。
总之,耦合是必须的,但应该被小心谨慎地管理(尽量降低耦合度)。
三、Spring容器
1.什么是Spring容器
容器是Spring的核心,是用来容纳所有bean的地方。
Spring 容器负责创建对象,装配对象,配置他们并管理他们的整个生命周期。
2.两种Spring容器
Spring自带了多个容器实现,可以归为两种不同类型:
(1)bean工厂
(由BeanFactory接口定义)
是最简单的容器,提供基本的DI支持。(低级封装,功能一般)
(2)应用上下文
(由ApplicationContext接口定义)
基于BeanFactory构建,并提供应用框架级别的服务。(高度封装,功能强大,推荐使用)
四、使用Spring应用上下文
Spring自带了多种类型的应用上下文。
1 | AnnotationConfigApplicationContext | 从一个或多个基于Java的配置类中加载Spirng应用上下文 |
2 | AnnotationConfigWebApplicationContext | 从一个或多个基于Java的配置类中加载Spring Web应用上下文。 |
3 | ClassPathXmlApplicationContext | 从类路径下的一个或多个XMl配置文件中加载上下文定义,把应用上下文的定义文件作为资源 |
4 | FileSystemXmlapplicationContext | 从文件系统下的一个或多个XML配置文件中加载上下文定义 |
5 | XmlWebApplicationContext | 从Web应用下的一个或多个XMl配置文件中加载上下文定义 |
1.从Java配置中加载上下文
//1.从Java配置中加载配置,将Bean装载到应用上下文。 ApplicationContext context=new AnnotationConfigApplicationContext(com.springaction.knights.config.KnightConfig.class);
2.从类路径加载上下文
//1.从类路径下读取配置文件,将Bean装载到应用上下文。 ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
3.从文件系统加载上下文
//1.从文件系统读取配置文件,将Bean装载到应用上下文。 ApplicationContext context=new FileSystemXmlApplicationContext("D:/applicationContext.xml");
应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean.
五、Bean的生命周期
传统Java应用中,使用Java关键字 new 进行bean的实例化,然后bean就可以使用了。一旦该bean不再使用,则由Java自动进行垃圾回收。
理解了Spring bean 的生命周期,就能利用Spring提供的扩展点来自定义bean的创建过程。
在bean准备就绪之前,bean工厂执行了若干启动步骤:
(1)Spring对bean进行实例化
(2)Spring将值和bean的引用注入到bean对应的属性中
(3)如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法
(4)如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入
(5)如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文的引用传入进来
(6)如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法
(7)如果bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()方法。
(8)如果bean使用init-method声明了初始化方法,则会执行init-method配置的方法,
(9)如果bean实现了BeanPostProcessor接口,Spring将调用他们的postProcessAfterInitialization()方法
(10)此时,bean已经准备就绪了,可以被应用程序使用了。他们将一直驻留在应用上下文中,直到该上下文被销毁。
(11)容器关闭
(12)如果bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。
(13)如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
[剑指offer] 把二叉树打印成多行
本文首发于我的个人博客:尾尾部落 题目描述 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。 解题思路 就是二叉树的层序遍历,用队列来实现。我们需要两个变量,一个start记录当前层已经打印的节点个数,一个end记录前当层所有的节点个数,当 start == end 时,表时当前层遍历完了,就可以开始下一层遍历。 参考代码 import java.util.ArrayList; import java.util.Queue; import java.util.LinkedList; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList...
- 下一篇
Java 的双重分发与 Visitor 模式
双重分发(Double Dispatch) 什么是双重分发? 谈起面向对象的程序设计时,常说起的面向对象的「多态」,其中关于多态,经常有一个说法是「父类引用指向子类对象」。 这种父类的引用指向子类对象的写法类似下面这种: 另一种常用的形式是 那上面的keeper调用两次say的时候,会输出什么内容呢?会调用到两个不同的方法吗? 实际上在这两次调用的时候,都会调用到say(Animal a)这个方法。由于这些内容在编译期就能确实下来,这就是 Java 的静态分发。 从上面的图我们看到,对于两次调用生成的字节码,确实都指向了say(Animal a)这个方法,运行时直接执行方法,输出了对应的内容。 那对应的animal.bark()为什么最终会调用到 dog 类的方法?这是在运行时确定具体的方法接收者的类型并执行。这就是所谓的动态分发,在运行时确定具体的方法,实现面向对象的多态。 分发(Dispatch) 分发就是指最终确定一个要执行的方法的过程。 对于 Java 等静态语言来说,都是通过 单一分发(Single Dispatch)来进行的方法执行。 比如这样一行代码 dog.eat...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Hadoop3单机部署,实现最简伪集群
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS关闭SELinux安全模块
- Docker使用Oracle官方镜像安装(12C,18C,19C)