ioc

Spring IOC(DI)和AOP学习笔记

自闭症网瘾萝莉.ら 提交于 2020-02-01 15:25:54
软件152 缑旭浩 首先概念阐述如下: IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序。对象及其依赖对象的创建及维护都不需要在应用程序中实现,将其交给IOC容器去管理。传统的开发中,我们自己在对象内部创建依赖对象并注入当前对象,完成依赖关系的维护;对于IOC而言,它强调是将主动变为被动,由IOC容器来负责依赖对象的创建和查找,由IOC容器来进行注入组合对象,我们只需要在相关的配置文件中维护对象之间的依赖关系即可。 DI: Dependency Injection,即“依赖注入”。其实IOC和DI本就是同一个概念的两种不同的表述,应用程序依赖容器提供的外部对象,容器将其依赖的外部资源在运行期注入到应用程序中;某个对象被调用时,其所依赖的对象由容器注入。 AOP是OOP的延续,是(Aspect Oriented Programming)的缩写,意思是面向切面编程。要理解AOP首先得弄明白代理的概念。AOP利用一种称为“横切”的技术,剖解开封装的对象内部,将那些影响多个类的公共行为封装到一个可重用模块,并将其名为方面(Aspect)。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑封装起来的部分。以便于减少系统的重复代码,降低模块间的耦合度,并有利于系统维护。

Spring IOC/DI和AOP原理(转发:https://www.cnblogs.com/techroad4ca/p/5770073.html)

♀尐吖头ヾ 提交于 2020-02-01 15:24:47
一 IOC/DI   1. 概念及原理   IOC: Inversion of Control(控制反转)是一种设计思想,就是容器控制应用程序所需要外部资源的创建和管理,然后将其反转给应用程序。对象及其依赖对象的创建及维护都不需要在应用程序中实现,将其交给IOC容器去管理。传统的开发中,我们自己在对象内部创建依赖对象并注入当前对象,完成依赖关系的维护;对于IOC而言,它强调是将主动变为被动,由IOC容器来负责依赖对象的创建和查找,由IOC容器来进行注入组合对象,我们只需要在相关的配置文件中维护对象之间的依赖关系即可。   DI: Dependency Injection,即“依赖注入”。其实IOC和DI本就是同一个概念的两种不同的表述,应用程序依赖容器提供的外部对象,容器将其依赖的外部资源在运行期注入到应用程序中;某个对象被调用时,其所依赖的对象由容器注入。   2. 优点   第一,资源集中管理,实现资源的可配置和易管理,降低对象关系维护的复杂度。   第二,降低了使用资源双方的依赖程度,也就是我们说的耦合度。 二 AOP   1. 概念和原理   AOP利用一种称为“横切”的技术,剖解开封装的对象内部,将那些影响多个类的公共行为封装到一个可重用模块,并将其名为方面(Aspect)。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑封装起来的部分

第二章 Spring bean实例化、IOC、循环依赖笔记

久未见 提交于 2020-02-01 05:56:17
一、 Bean的实例化过程 流程图地址: https://www.processon.com/view/link/5df87156e4b0cfc88c3c18c5 org.springframework.context.support.AbstractApplicationContext#refresh方法中 /* * 这个方法是spring中最重要的方法,没有之一 , 所以这个方法一定要理解要具体看 * 1、bean实例化过程 * 2、ioc * 3、注解支持 * 4、BeanPostProcessor的执行 * 5、Aop的入口 */ // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); 1、 BeanDefinitionRegistryPostProcessor接口 Refresh().invokeBeanFactoryPostProcessors这个方法里面。 BeanDefinitionRegistryPostProcessor这个接口的调用分为三部: 1)调用实现了PriorityOrdered排序接口 2)调用实现了Ordered排序接口 3)没有实现接口的调用 这个接口的理解

spring ioc容器源码分析

六眼飞鱼酱① 提交于 2020-02-01 00:52:29
Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器。既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文并不能让你成为 Spring 专家,不过一定有助于大家理解 Spring 的很多概念,帮助大家排查应用中和 Spring 相关的一些问题。 本文采用的源码版本是 4.3.11.RELEASE,算是 5.0.x 前比较新的版本了。为了降低难度,本文所说的所有的内容都是基于 xml 的配置的方式,实际使用已经很少人这么做了,至少不是纯 xml 配置,不过从理解源码的角度来看用这种方式来说无疑是最合适的。 阅读建议:读者至少需要知道怎么配置 Spring,了解 Spring 中的各种概念,少部分内容我还假设读者使用过 SpringMVC。本文要说的 IOC 总体来说有两处地方最重要,一个是创建 Bean 容器,一个是初始化 Bean,如果读者觉得一次性看完本文压力有点大,那么可以按这个思路分两次消化。读者不一定对 Spring 容器的源码感兴趣,也许附录部分介绍的知识对读者有些许作用。 希望通过本文可以让读者不惧怕阅读 Spring 源码,也希望大家能反馈表述错误或不合理的地方。 目录 文章目录 引言 BeanFactory 简介 启动过程分析 创建 Bean 容器前的准备工作 创建

跟着小马哥学习Spring(1)

拥有回忆 提交于 2020-01-31 23:02:13
Spring作为IOC容器有什么优势 ? 典型的IOC管理,依赖查找和依赖注入 AOP抽象 事务抽象 事件机制 SPI扩展 强大的第三方整合 易测试性 更好的面向对象 2,ObjectFactory 和 BeanFactory 及 FactoryBean 有什么区别 3,SpringIOC依赖来源 自定义bean 容器内建的bean对象 容器内建依赖 4,ApplicationContext 是 BeanFactory的子接口 beanFactory是一个底层的容器 applicationContext是在他的基础上新增了一些功能 来源: CSDN 作者: 码农小姐姐在奔跑 链接: https://blog.csdn.net/weixin_45329175/article/details/104102140

Spring 核心容器 IOC

跟風遠走 提交于 2020-01-31 22:34:39
目录 1. BeanFactory 2. BeanDefinition 3、BeanDefinitionReader 4 . Web IOC 容器初体验 一 、BeanFactory Spring Bean 的创建是典型的工厂模式,这一系列的 Bean 工厂,也即 IOC 容器为开发者管理对象 间的依赖关系提供了很多便利和基础服务。最基本的 IOC 容器接口 BeanFactory,来看一下它的源码: public interface BeanFactory { //对 FactoryBean 的转义定义,因为如果使用 bean 的名字检索 FactoryBean 得到的对象是工厂生成的对象, //如果需要得到工厂本身,需要转义 String FACTORY_BEAN_PREFIX = "&"; //根据 bean 的名字,获取在 IOC 容器中得到 bean 实例 Object getBean(String name) throws BeansException; //根据 bean 的名字和 Class 类型来得到 bean 实例,增加了类型安全验证机制。 <T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException; Object getBean(String name,

如何理解spring

给你一囗甜甜゛ 提交于 2020-01-31 17:24:06
什么是ioc ioc全称是【Inversion of Control】控制反转,按照字面意思理解,将控制反转过来,这里的控制指的是什么,为什么要进行反转,ioc可以解决什么问题?要回答这些问题,我们需要先了解一下ioc为什么会产生 为什么要有ioc java是一门面向对象的语言,我们的应用程序通过一个个对象之间的相互关联和作用来完成功能,在网上看到一个特别形象的比喻,这里借用一下:这里的每一个齿轮代表一个对象,对象之间彼此紧密咬合形成一个系统,这样的系统对象之间的耦合度非常高,所谓的耦合度就是关系的紧密程度,高耦合度带来的问题显而易见,只要有一个齿轮发生故障,其它齿轮也无法工作,进而整个系统都无法正常工作,这种牵一发而动全身情况如何才能改善呢?看下图:中间这个齿轮好比一个粘合剂将其它几个齿轮粘合起来,所有的齿轮都交由中间这个齿轮管理,试着把中间这个齿轮拿掉我们可以看到这三个齿轮之间彼此毫无关系,即使一个齿轮出了故障,也不会影响到其它齿轮,中间这个齿轮就好比ioc容器,其它齿轮就是对象,可以看出引入了ioc容器,对象之间的耦合度降低了。当我们修改一个对象的时候不需要去考虑其它对象,因为它不会对其它对象造成影响。 ioc的原理 这里说到的ioc容器到底是个什么东东,又是什么让它具有如此神奇的力量? 先来看一下没有ioc容器的时候,对象A依赖对象B

Spring4天-第一天IOC

别等时光非礼了梦想. 提交于 2020-01-31 08:15:33
1.什么是Spring Spring 分层的Java SE/EE 应用轻量级框架,以IOC ( Inversion of Controll控制反转) 和AOP(Aspect oriented Programming,面向切面编程,本质是动态代理,不修改源码的情况下进行功能增强)为内核 。 提供了 2.Spring 体系结构 3.耦合性问题: * 耦合性:程序之间的依赖性。 * 编译期依赖:编译时必须提供依赖的类,否则编译不通过。应当避免编译期依赖 * 运行期依赖:运行时必须提供依赖的类,否则不能运行 * 耦合性越强,维护成本就越高 * 开发时要求:高内聚,低耦合 4.耦合性问题现象 * 在web开发中,服务端通常分为三层:web层、service层、dao层 * web层调用service层完成功能:需要new一个Service对象 * service层调用dao层操作数据库:需要new一个dao对象 * 三层之间的耦合性比较强:存在编译期依赖 * service里写死了创建某一个dao对象:一旦dao对象换了,就需要修改service的源码 * web里写死了创建某一个service对象:一旦service对象换了,就需要修改web的源码 5.解耦思路 方法1:可以使用反射技术,代替`new`创建对象,避免编译期依赖。 Class clazz = Class.forName(

学spring第一次总结

China☆狼群 提交于 2020-01-31 08:14:06
1,Spring 概述 spring 是一个开源框架 spring 是一个IOC和AOP容器框架 spring 的特性:非侵入式,依赖注入,面向切面编程,容器,组件化,一站式。 2, IOC和DI IOC(Inversion of Control):反转控制 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的资源,在这样的模式下开发人员往往需要知道在具体容器中特定资源的获取方式,增加了学习成本,同时降低了开发效率。 反转控制的思想完全颠覆了应用程序组件获取资源的传统方式:反转了资源的获取方向——改由容器主动的将资源推送给需要的组件,开发人员不需要知道容器是如何创建资源对象的,只需要提供接收资源的方式即可,极大的降低了学习成本,提高了开发的效率。这种行为也称为查找的被动形式。 DI(Dependency Injection):依赖注入 IOC的另一种表述方式:即组件以一些预先定义好的方式(例如:setter 方法)接受来自于容器的资源注入。相对于IOC而言,这种表述更直接。 IOC 描述的是一种思想,而DI 是对IOC思想的具体实现. IOC容器在Spring中的实现 1)在通过IOC容器读取Bean的实例之前,需要先将IOC容器本身实例化。 2)Spring提供了IOC容器的两种实现方式 ① BeanFactory:IOC容器的基本实现

简单模拟IOC容器:返回对象并能抛出异常

孤街醉人 提交于 2020-01-30 23:18:23
本次要求:已知com.zzj.vo包下分别有Tiger、lion、Elephant三个Java源文件,请据此实现以下功能: ①、自定义一个名为Component的注解,要求该注解只能用于类且代码运行时该注解依然有效; ②、为Tiger和Lion类添加component注解 ③、在Application类中定义静态代码块,该代码块可自动将有Component注解修饰的类创建对象并放在Map集合中;然后定义一个名为getBean的static方法,要求传入Class类实例时返回该Class类对应类的对象,如果没有Class类对应的对象,则引发NoSuchBeanDefinitionException异常并提示“No qualifying bean of type 'com.lq.vo.类名'available ” ; Component注解 package com.zzj.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; //范围只限定类,存在周期运行后 @Target(ElementType