ioc

Spring AOP 源码解析

若如初见. 提交于 2020-01-23 10:46:26
[TOC] 之前写过 IOC 的源码分析,那篇文章真的有点长,看完需要点耐心。很多读者希望能写一写 Spring AOP 的源码分析文章,这样读者看完 IOC + AOP 也就对 Spring 会有比较深的理解了。今天终于成文了,可能很多读者早就不再等待了,不过主要为了后来者吧。 本文不会像 IOC 源码分析那篇文章一样,很具体地分析每一行 Spring AOP 的源码,目标读者是已经知道 Spring IOC 源码是怎么回事的读者,因为 Spring AOP 终归是依赖于 IOC 容器来管理的。 阅读建议:1、先搞懂 IOC 容器的源码 ,AOP 依赖于 IOC 容器来管理。2、仔细看完 Spring AOP 使用介绍 这篇文章,先搞懂各种使用方式,你才能"猜到"应该怎么实现。 Spring AOP 的源码并不简单,因为它多,所以阅读源码最好就是找到一个分支,追踪下去。 本文定位为走马观花,看个大概,不具体到每一个细节。 目录: 前言 这一节,我们先来"猜猜" Spring 是怎么实现 AOP 的。 在 Spring 的容器中,我们面向的对象是一个个的 bean 实例,bean 是什么?我们可以简单理解为是 BeanDefinition 的实例,Spring 会根据 BeanDefinition 中的信息为我们生产合适的 bean 实例出来。 当我们需要使用 bean 的时候

Spring容器IOC详细介绍

狂风中的少年 提交于 2020-01-23 02:25:49
Spring的IOC也就是控制反转,DI是基于IOC的基础上进行的 写过java的都知道:所有的对象都必须创建;或者说:使用对象之前必须先创 建。而使用ioc之后,你就可以不再手动创建对象,而是从ioc容器中直接获取对 象。 就好像我们无需考虑对象的销毁回收一样,因为java垃圾回收机制帮助我们实现 了这个过程;而ioc则是让我们无需考虑对象的创建过程,由ioc容器帮我们实现 对象的创建、注入等过程。 具体介绍如图: 来源: CSDN 作者: 六月·飞雪 链接: https://blog.csdn.net/z_ssyy/article/details/103785807

java-SpringIOC

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-23 01:55:40
一:IOC IOC(Inversion of Control) ,反转资源控制.容器主动地将资源推送到它所管理的组件,组件所需要做的仅仅是选择一种合适的方式来接受资源,翻转指的是获取对象的方式。 将创建对象,属性值的方式进行了翻转,从new,setXX()翻转成从IOC容器getbean。 二:DI 组件以一些预先定义好的方式接受来自容器的资源注入。 将属性值注入给了属性,将属性注入bean,将bean注入给了IOC容器。 三:BeanFactory、ApplicationContext Spring提供了两种类型的ioc实现,分别是BeanFactory和ApplicationContext。 BeanFactory IOC容器的基本实现,是Spring框架的基础设施,面向Spring本身。 ApplicationContext ApplicationContext提供了更多的高级特性,是BeanFactory的子接口。面向使用Spring框架的开发者,几乎所有应用场合都使用ApplicationContext,而不是BeanFactory。 //1.创建Spring的IOC容器对象 ApplicationContext ctx = new ClassPathXmlApplicationContext ( "applicationContent.xml" ) ; //2

Java 程序员面试笔试宝典 第 5 章 Java Web:(5.3.11-5.3.19)

烂漫一生 提交于 2020-01-22 19:32:52
5.3.11 什么是 IoC 控制反转(Inverse of Control,IoC)有时也被称为依赖注入,是一种降低对象之间耦合关系的设计思想。一般而言,在分层体系结构中,都是上层调用下层的接口,上层依赖于下层的执行,即调用者依赖于被调用者。而通过 IoC 方式,使得上层不再依赖于下层的接口,完成控制反转,使得由调用者来决定被调用者。IoC 通过注入一个实例化的对象来达到解耦和的目的。使用这种方法后,对象不会被显式地调用,而是根据需求通过 IoC 容器(例如 Spring)来提供。 采用 IoC 机制能够提高系统的可扩展性,如果对象之间通过显式调用进行交互会导致调用者与被调用者存在着非常紧密的联系,其中一方的改动将会导致程序出现很大的改动。 例如,要为一家卖茶的商店提供一套管理系统,在这家商店刚开业时只卖绿茶(GreenTea),随着规模的扩大或者根据具体销售量,未来可能会随时改变茶的类型,例如红茶(BlackTea)等,传统的实现方法会针对茶抽象化一个基类,绿茶类只需要继承自该基类即可,如图 5-12 所示。 采用该实现方法后,在需要使用 GreenTea 时只需要执行以下代码即可:AbstractTea t=new GreenTea(),当然,这种方法是可以满足当前设计要求的。但是该方法的可扩展性不好,存在着不恰当的地方,例如,商家发现绿茶的销售并不好,决定开始销售红茶

Spring中控制反转IoC理论推导

試著忘記壹切 提交于 2020-01-22 08:03:31
Spring中的IoC是一种思想。所谓控制反转,也就是从创建对象的主动权在程序员手中,到创建对象的主动权在用户手中。控制反转官方定义是一种通过描述(XML或注解)并通过第三方生产或获取特定对象的方式,在Spring中实现控制反转的是IoC容器,其实现方式是依赖注入(Dependence Injection,DI)。 我在这里以代码和需求的形势进行阐述 首先我在Dao层写一个UserDao的接口里面有一个方法 package com.zhiying.dao; public interface UserDao { public void getUser(); } 然后写一个UserDaoImpl的类来实现这个接口,并输出一句话 package com.zhiying.dao; public class UserDaoImpl implements UserDao { public void getUser() { System.out.println("this is a user"); } } 现在我们开始写Service层,这里写一个UserService的接口,并定义一个方法 package com.zhiying.service; public interface UserService { public void getUser(); }

手写Spring之DI依赖注入

混江龙づ霸主 提交于 2020-01-22 05:44:27
之前写过了spring的IOC实现方式,现在则写DI依赖注入的实现方式 贴类图 由于在实现完DI进行测试的时候,会用到junit包,所以在pom.xml导入依赖 < ! -- SpringDI -- > < dependency > < groupId > junit < / groupId > < artifactId > junit < / artifactId > < version > 4.13 - beta - 3 < / version > < scope > compile < / scope > < / dependency > 接下来开始写,先创建几个需要的注解 package com . spring . DI . annotation ; import java . lang . annotation . ElementType ; import java . lang . annotation . Retention ; import java . lang . annotation . RetentionPolicy ; import java . lang . annotation . Target ; @Target ( ElementType . FIELD ) @Retention ( RetentionPolicy . RUNTIME )

Spring IoC - Spring IoC 的设计

╄→尐↘猪︶ㄣ 提交于 2020-01-21 17:11:47
前言 本文为解读Spring IoC 模块源码的开篇介绍。介绍Spring IoC 的相关概念与设计。 What is IoC 控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递(注入)给它。 – 摘自维基百科 大型应用中,需要多个类组合工作来实现业务逻辑。这使得每个对象都需要在工作的时候获取到与其合作的对象的引用。 如果这个获取过程要靠自身来实现,那么,代码会变得高度耦合并且难以测试。这对复杂的OOP系统的设计是非常不利的。 在OOP系统中,对象封装了数据和对数据的处理动作,对象的依赖关系体现在了对数据和方法的依赖上。这些依赖关系,可以通过把对象的依赖注入交给框架或IoC容器来完成。 简单来说: 控制:当前对象对其内部成员对象的控制权/获取组装对象的过程 反转:上述的过程/控制权,交由专门的第三方组件(容器或者说平台)来管理 这种从具体对象手中,交出控制的做法,在解耦代码的同时提高了代码的可测试性。好处具体如下: 不用自己组装,拿来就用。 享受单例的好处

Spring IoC - 依赖注入源码解析

百般思念 提交于 2020-01-21 16:20:29
前言 上一篇文章中,我们介绍了Spring IoC 的容器初始化过程 - IoC 容器初始化 本篇文章中,我们继续介绍Spring IoC 依赖注入的过程和源码解读。 还是如之前一样,为大家梳理一下步骤流程,以便于大家能在心里有个大概的脉络,更容易读懂源码,更容易抓住重点。 主要内容: beanName 解析转换 手动注册Bean检测 双亲容器检测 依赖初始化(递归) ★ 创建singleton 实例 对象实例化 属性装配 处理Bean创建之后的各种回调事件 … 源码解析 上一章最后一节,容器初始化的倒数第二步, finishBeanFactoryInitialization(beanFactory) 实例化所有单例,调用了 getBean() 方法来做singleton bean 的实例化操作。这就是Spring IoC 依赖注入的入口。 在开始之前,有一点需要提一下。前面我们是从容器初始化之后进来的,但实际操作中,我们有可能是在程序普通运行情况下,用 ApplicationContext.getBean() 去获取容器中bean。不要局限于刚刚的视角中。 现在让我们开始吧。 首先看看 getBean() 源码位置: AbstractBeanFactory#getBean(String name) @Override public Object getBean ( String

IOC依赖注入的原理

China☆狼群 提交于 2020-01-21 07:54:02
一、什么是IOC 维基百科上说到:2004年Martin Fowler 提出了“控制反转的”概念,他得出的结论是:依赖对象的获得被反转了。后来为这个创造了一个更好的名字:依赖注入(IOC = Inversion of Control).简单的解释是:系统的运作是通过两个或多个类的合作来实现业务逻辑,这使得每个对象都需要与其合作的对象的引用(依赖关系),这个依赖对象以前是通过自身实现去获得,现在通过一个容器统一的管理这些依赖关系,从而获得这种依赖的这种实现方式,我们可以成为IOC。 如:C—>A,B—>A,D—>A,经过IOC后,变成A—>C,A—>B,A—>D。 二、为什么要用IOC 我们知道任何事物的诞生,总会有其目的,这里我们先模拟几种场景,让我们更清楚的了解IOC是如何诞生的。 例1: A类 需要用到业务B类的引用,这时候我们在A 里面进行 B b = new B();随着系统的庞大,我可能后面 C,F,G...N 都要用B类的引用,我们在每个类里面都进行类似A的操作吗?好吧,你这样做了!但是突然有一天需要变化,B类我们必须要一个带参构造public B(Stirng str){}.那么你要把所有的类的引用全部修改一次吗?如果可能继续扩展,继续变化呢? 例2:同样很多类都需要B类的引用,B是A接口的实现,我现在不想用实现类B了,重新实现一个类C,全部替换过来,那么你需要从N

01Spring的IOC与DI

我的未来我决定 提交于 2020-01-21 05:17:45
0、Spring概述 参考文献,官网 0.0、什么是Spring Spring是一个以IOC(控制反转)和AOP(面向切面编程)为内核的框架。IOC是Spring的基础,简单地说,就是以前调用new构造函数方法来创建对象,现在变成成使用Spring来创建对象。DI(依赖注入)与IOC的含义相同,从两个角度来描述同一个概念。简单的说,DI就是对象的属性,已经被注入好相关的值,直接使用即可。 0.1、Spring概述 Spring是分层的JavaSE/EE应用full-stack轻量级开源框架,以IOC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多的JavaEE企业应用开源框架。 0.2配置小结 0.2.1、POM.XML配置 < dependencies > <!--提供在IOC基础上扩展的功能--> < dependency > < groupId > org.springframework </ groupId > < artifactId > spring-context </ artifactId > < version >