spring ioc 和 aop详解(附IOC源码解读链接)

SpringBoot是如何实现AOP和IOC的 SpringBoot是如何自动实现IOC和AOP的 一、概念解析(AOP & IOC/DI) 本文主要是通过代码实现Spring Boot中的IOC和AOP配置。一些概念性的东西可以去我的博客了解。这里的AOP和IOC是属于Spring容器框架的范畴。和SpringBoot关系不大,因为Spring Boot的初中是整合简化了Spring和Spring MVC的开发。 1、关于IOC/DI的概念分析(简单全面)。☞点击链接前往; 这一片文章是多年前在学习使用Spring的过程中整理的。里面包括了很 阅读详情

1.AOP

AOP(面向切面)是一种编程范式,提供从另一个角度来考虑程序结构以完善面向对象编程(OOP)。
AOP为开发者提供了一种描述横切关注点的机制,并能够自动将横切关注点织入到面向对象的软件系统中,从而实现了横切关注点的模块化。
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

使用AOP的好处

  • 降低模块的耦合度
  • 使系统容易扩展
  • 提高代码复用性

AOP的基本概念

  • 连接点(JoinPoint):需要在程序中插入横切关注点的点,连接点可能是在类初始化、方法调用、字段调用或处理异常等等。Spring中只支持方法执行连接点。
  • 切入点(Pointcut):一组相关连接点的集合。
  • 通知(Advice):在连接点上执行的行为,增强提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段。包括前置增强(before advice)、后置增强 (after advice)、环绕增强 (around advice)。
  • 切面(Aspect):通知和切入点的结合。
  • 织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程。
  • 代理(Proxy):通过代理方式来对目标对象应用切面。AOP代理可以用JDK动态代理或CGLIB代理实现。
  • 目标对象(Target):需要被织入关注点的对象。即被代理的对象。

     

实现AOP的主要设计模式就是动态代理。
Spring的动态代理有两种:一是JDK的动态代理;另一个是cglib动态代理。

JDK动态代理模拟
JDK动态代理的两个核心接口(类)分别是InvocationHandler和Proxy。注意:只能代理接口

public class TimeHandler implements InvocationHandler {  
      
    // 目标对象  
    private Object targetObject;  
    
    public TimeHandler(Object targetObject){
          this.targetObject = targetObject;
    }
    @Override  
    //关联的这个实现类的方法被调用时将被执行  
    /*InvocationHandler接口的方法,proxy表示代理,method表示原对象被调用的方法,      
        args表示方法的参数*/  
    public Object invoke(Object proxy, Method method, Object[] args)  
            throws Throwable {  
        Object ret=null;  
        try{  
            System.out.println("方法之前:"+System.currentTimeMillis());    
            //调用目标方法  
            ret=method.invoke(targetObject, args);  
            System.out.println("方法之后:"+System.currentTimeMillis());  
        }catch(Exception e){  
            e.printStackTrace();  
            System.out.println("error");  
            throw e;  
        }  
        return ret;  
    }  
  
} 

TimeHandler 类实现了InvocationHandler接口。实现核心方法invoke,共有3个参数。第一个参数 生成的代理类实例,第二个参数 目标对象的方法,第三个参数 方法的参数值数组。

public class ProxyUtil {
    
    @SuppressWarnings("unchecked")
    public static <T> T proxyOne(ClassLoader loader,Class<?>[] clz,InvocationHandler handler){
        return (T)Proxy.newProxyInstance(loader, clz, handler);
    }
}

ProxyUtil 类简单封装了一下Proxy.newProxyInstance()方法。该方法也有3个参数。第一个参数产生代理对象的类加载器,第二个参数目标对象的接口数组,第三个参数就是实现InvocationHandler接口的类实例。

public interface UserManager {
    public void addUser(String userId, String userName);
}
public class UserManagerImpl implements UserManager {
    @Override
    public void addUser(String userId, String userName) {
        System.out.println("addUser(id:"+userId+",name:"+userName+")");
    }

}

public static void main(String[] args) {
         UserManager um=new UserManagerImpl(); 
         LogHandler log =new LogHandler(um); 
     um=ProxyUtil.proxyOne(um.getClass().getClassLoader(), 
                 um.getClass().getInterfaces(), log);
         
       TimeHandler time = new TimeHandler(um);
       um=ProxyUtil.proxyOne(um.getClass().getClassLoader(), 
                 um.getClass().getInterfaces(), time);
         
         um.addUser("1111", "张三");
    }

为了演示需要,这边又增加了一个LogHandler,跟TimeHandler代码一样。

CGLIB动态代理模拟
CGLIB动态代理的两个核心接口(类)分别是MethodInterceptor和Enhancer。是不是跟JDK动态代理很相似,用法也差不多。但CGLIB可以代理类和接口。注意:不能代理final类。


 

public class TimeInterceptor implements MethodInterceptor {
    private Object target;  
    public TimeInterceptor(Object target) {
        this.target = target;
    }
    @Override
    public Object intercept(Object proxy, Method method, 
            Object[] args, MethodProxy invocation) throws Throwable {
        System.out.println("方法之前:"+System.currentTimeMillis());
        Object ret = invocation.invoke(target, args); 
        System.out.println("方法之后:"+System.currentTimeMillis());
        
        return ret;
    }
}

intercept方法4个参数。1.生成的代理类实例。2.被代理对象的方法引用。3.方法参数值数组。4.代理类对方法的代理引用。

public class ProxyUtil {
    @SuppressWarnings("unchecked")
    public static <T> T proxyOne(Class<?> clz,MethodInterceptor interceptor){
        return (T)Enhancer.create(clz, interceptor);
    }

}

Enhancer类是CGLib中的字节码增强器。

public class UserManage {
    public void addUser(String userId, String userName) {
        System.out.println("addUser(id:"+userId+",name:"+userName+")");
    }
}


public static void main(String[] args) {
        UserManage um = new UserManage();
        TimeInterceptor time = new TimeInterceptor(um);
        um = ProxyUtil.proxyOne(um.getClass(), time);
        um.addUser("111", "老王");
    }

2.IOC

IOC(控制反转)就是依赖倒置原则的一种代码设计思路。就是把原先在代码里面需要实现的对象创建、对象之间的依赖,反转给容器来帮忙实现。
Spring IOC容器通过xml,注解等其它方式配置类及类之间的依赖关系,完成了对象的创建和依赖的管理注入。实现IOC的主要设计模式是工厂模式。


使用IOC的好处

 

  • 集中管理,实现类的可配置和易管理。
  • 降低了类与类之间的耦合度。

简单模拟IOC



 

public interface BeanFactory {
    Object getBean(String id);  
}

public class ClassPathXmlApplicationContext implements BeanFactory {
    //容器,用来存放注入的Bean  
    private Map<String, Object> container = new HashMap<String, Object>();  

    //解析xml文件,通过反射将配置的bean放到container中  
    public ClassPathXmlApplicationContext(String fileName) throws Exception{  
        SAXBuilder sb = new SAXBuilder(); 

        Document doc 
        =sb.build(ClassPathXmlApplicationContext.class.getResource("/"+fileName));
       
        Element root = doc.getRootElement();  
        List<Element> list = XPath.selectNodes(root, "/beans/bean");  

        for (int i = 0; i < list.size(); i++) {              
           Element bean = list.get(i);  
           String id = bean.getAttributeValue("id");  
           String clazz = bean.getAttributeValue("class");  
           Object o = Class.forName(clazz).newInstance();  
           container.put(id, o);  
          }  
    }
    @Override  
    public Object getBean(String id) {        
        return container.get(id);  
    }  

}
<?xml version="1.0" encoding="UTF-8"?>  
<beans>  
  <bean id="people" class="com.ioc.People" />  
  <bean id="chicken" class="com.ioc.Chicken" />  
  <bean id="dog" class="com.ioc.Dog" />  
</beans>  
public interface Animal {
     void say();  
}

public class Dog implements Animal {
    @Override
    public void say() {
         System.out.println("汪汪"); 
    }
}
public class Chicken implements Animal {
    @Override
    public void say() {
        System.out.println("鸡你很美");  
    }
}
public class People {
    public void info(){
        System.out.println("小明-23岁");
    }
}
public static void main(String[] args) throws Exception {  

        //加载配置文件  
        BeanFactory f = new ClassPathXmlApplicationContext("applicationContext.xml");  

        Object os = f.getBean("dog");  
        Animal dog = (Animal)os;  
        dog.say();  

        Object op = f.getBean("chicken");  
        Animal chicken = (Animal)op;  
        chicken.say();  

        Object p = f.getBean("people");  
        People people= (Animal)p;  
        people.info();  
    } 

----------------

ioc源码解读:https://www.cnblogs.com/ITtangtang/p/3978349.html

spring ioc和aop原理流程图(详细) spring ioc容器初始化流程图 spring ioc容器依赖注入流程图 spring aop实现原理流程图 立即下载

相关推荐

【matlab】MATLAB 变量详解与应用

在 MATLAB 中,变量可以通过赋值操作进行定义。例如,要定义一个名为xx = 10;在这个例子中,我们创建了一个名为x的变量,并将其赋值为 10。需要注意的是,MATLAB 是一种动态类型语言,因此不需要显式地声明变量的类型。变量名必须以字母开头。变量名可以包含字母、数字和下划线。变量名区分大小写。不要使用 MATLAB 中的关键字(如forif等)作为变量名。

小吴同学的博客 2215

spring IOC AOP 原理源码解读

Spring IOC(控制反转)和AOP(面向切面编程)是Spring框架的核心功能,它们为Java开发人员提供了一种强大的方式来管理和解耦应用程序的各个组件,以及实现横切关注点。在这篇文章中,我们将深入探讨Spring IOC和AOP的概念、实现原理以及应用场景。一、Spring IOC1.1 概念IOC,也称为控制反转,是一种设计原则,旨在将对象的创建和管理权从应用程序代码中移交给外部容器。在Spring框架中,IOC容器负责创建、管理和生命周期管理对象。

SkyinEast的博客 424

对西安交大轴承数据集XJTU-SY_Bearing_Datasets进行读取和处理:

故障诊断,对西安交大轴承数据集XJTU-SY_Bearing_Datasets进行读取和处理

qq_44757503的博客 6068

Spring IOC和Spring AOP的实现原理(源码主线流程)

写在前面       正本文参考了《spring技术内幕》和spring 4.0.5源码。本文只描述原理流程的主线部分,其他比如验证,缓存什么可以具体参考源码理解。 Spring IOC 一、容器初始化       容器的初始化首先是在对应的构造器中进行,在applicationContext的实现类构造器中,首先对参数路径中的${}进行了处理,用系统变量替换(setConfigL

u013430196的博客 7725

PPT高清导出秘籍:如何轻松设置600dpi图片分辨率

本文详细解析了PPT导出图片模糊的根本原因,并提供了通过修改Windows注册表将导出分辨率从默认的96dpi提升至600dpi的完整教程。该方法能显著提升图片清晰度,满足学术出版与高质量印刷需求,文中还包含效果对比、进阶设置及常见问题解答。

a0b1c2d3的专栏 1321

【原创教程】AB上位机FactoryTalk View的使用教程

条形图主要的作用就是根据绑定的变量中数字大小的变化来反映到图形中,随着数字的增加填充的颜色不断上升或随着数字的减小填充的颜色不断下降。绘图功能中常用的功能主要是:数字输入,数字输出,字符输入,字符输出,各种类型的的按钮,条状图,各类控件,系统自带的图形库。颜色指的是根据PLC变量的变化来改变图形的颜色,可以绑定BOOL量来显示两种颜色,也可以绑定字节,字,双字等来显示多种颜色。打开软件后右键点击画面选项然后点击新建则新建出一个画面,画面画好后点击保存并更改标题后新建的画面则会出现在画面选项的文件夹下。

Qinmingyue13的博客 4683

简单理解Spring之IOC和AOP及代码示例

参考文章:简单理解Spring之IOC和AOP及代码示例 Spring是一个开源框架,主要实现两件事,IOC(控制反转)和AOP(面向切面编程)。 IOC 控制反转,也可以称为依赖倒置。 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B。所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取...

justlpf的专栏 784

MATLAB极坐标伪彩色圆图绘制之polarPcolor函数

polarPcolor函数介绍 我们经常在论文或期刊上看到如下图这种以色调冷暖代表数值大小的极坐标圆图, 而function [varargout] = polarPcolor(R,theta,Z,varargin)可以很好的帮助我们快速绘制这类极坐标圆图。它非常适合雷达或激光雷达的平面位置指示器。使用polarPcolor函数时,我们只需根据手中数据构造相应的二维矩阵Z即可,十分便捷。varargin值为绘制模式选择。R值为半径坐标一维矩阵,theta值为角坐标一维矩阵。 代码示例 这里使用了海洋表面耀光

qq_19512613的博客 1万+

spring、Ioc和Aop两大核心源码分析

Spring总结 一、SpringIOC 1、IOC Spring ioc即控制反转,ioc容器负责实例化、定位、配置应用程序中的对象及建立这些对象的依赖,交给spring容器统一进行管理,从而达到解耦的目的 2、IOC实现原理及源码分析 (1)、整体流程图 (2)、源码分析 首先进行源码搭建,搭建过程在上一篇博客请查看: https://blog.youkuaiyun.com/weixin_37601506/article/details/114878397?spm=1001.2014.3001.5501 在源码工程

weixin_37601506的博客 823

Python 爬虫实战:爬虫代码打包为可执行文件

本文详细介绍了使用PyInstaller工具将Python爬虫打包为可执行文件的全过程。以豆瓣电影Top250爬虫为例,首先对比了主流打包工具,推荐选择跨平台的PyInstaller。通过编写完整的爬虫代码(包含异常处理和数据保存功能),演示了从环境准备、代码测试到打包配置的具体步骤。重点讲解了单文件打包、自定义图标等高级功能,并针对常见的"找不到模块"、文件体积过大等问题提供了解决方案。文章还说明了跨平台打包的注意事项,帮助开发者实现爬虫程序的无环境依赖部署,大幅提升程序的易用性和部署

2503_91057718的博客 2217

uniapp [全端兼容] - 实现全景图Vr 720°全景效果查看预览功能,3D全景图流畅不卡顿渲染+手势拖拽+悬浮工具按钮,uniAPP实现vr看720度全景效果示例代码(H5小程序APP全兼容)

uniapp显示720度全景图,720°全景图显示,在h5中展示720°全景图,浏览全景图,基于uniApp实现vr全景预览,加载全景图,uni-app全景预览插件,UNI-APP实现3D全景图,实现720°全景图展示,uniapp全景视频播放,uniapp项目实现vr720度全景图片预览,在网页上展示760全景图片和视频,全景图场景切换,UNIAPP全景VR图,uniapp加载720全景图_uniapp怎么加载vr图片,uniapp实现vr全景看房,uni-app实现全景效果,加载很慢卡怎么办,实现全景预

🏆 前端领域优质创作者 1万+

Spring的IOC和AOP

Spring、IOC、AOP、依赖注入、切面、事务

蓝影铁哥的博客 958

Python爬虫实战:模拟登录知乎 – 通过加密参数和验证码实现自动登录

通过本篇博客的讲解,我们学习了如何通过 POST请求 和 验证码识别,模拟登录知乎并爬取用户信息、问题数据。随着爬虫技术的发展,面对更复杂的反爬虫机制,我们可以不断调整策略,以绕过这些防护,实现数据的自动化抓取。

2201_76125261的博客 731

Spring AOP 源码分析

AOP 面向切面编程,全称 Aspect Oriented Programming ,它是 OOP 的补充,OOP关注的是对象,而AOP的核心是切面(Aspect)。AOP可以在不修改功能代码的本身的前提下,使用运行时代理的技术对已有代码逻辑增强。AOP可以实现组件化,可插拔式的功能扩展,通过简单配置功能增强到指定的切入点。

程序猿进阶 2874

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring IOC/DI、AOP 源码详解

思维导图 思维导图链接 https://www.yuque.com/docs/share/13828bff-6abf-4a12-8970-d4842e8994e3?# 《Spring IOC/DI、AOP 源码详解》 思维导图内容 Spring IOC/DIAOP 核心概念 BeanDefinition BeanDefinition 中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。 BeanDef

轻狂書生的博客 478

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【spring源码系列-02】通过refresh方法剖析IOC的整体流程

通过refresh方法剖析IOC的整体流程

zhenghuishengq的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

自己实现的一个简易Spring框架(IoC+AOP)

IoC和AOP是Spring的核心,可以说没有他们就没有庞大的Spring家族。我也是心血来潮,自己动手写了一个简易的Spring框架。可以通过使用注解来实现IoC容器和AOP。 先说IoC部分吧。源码下载:http://download.youkuaiyun.com/detail/jobsandczj/9841126 IoC 先定义了两个注解@MyBean和@MyAutowired,用来标记Bean和

路漫漫 始于足下 1646

Spring全面详解

Spring基础部分,适合Java开发者来看。或者学习者。编译器采用了IDEA2020.2.3比较新的一个版本。里面记录了很多东西,保持持续的更新,如果只是想下载Spring里面也提供了链接,和一些依赖jar链接。希望对你们有所帮助,对我有所提升!

想看什么文章都可以私信给我,综合性博客。 9792

【spring源码系列-01】spring底层源码整体概述

spring源码整体概述

zhenghuishengq的博客 1万+

Spring的IoC容器Bean创建过程从理论到源码分析

文章目录 系列文章目录 前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 我们都知道Spring有以下很多优点: 方便解耦,简化开发。降低了业务对象替换的复杂性,可以让开发人员更关注业务逻辑 方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付 数据库事务问题 ...... 1.那IOC起到了什么作用? IOC容器的主要作用其实就是第一点说的,方便解耦,简化开发。 (1).那它是如何解耦的? 这就.

持续学习,共同进步 1万+

你要的《Spring系列源码解读》PDF它来了

作者:z小赵★一枚用心坚持写原创的“无趣”程序猿,在自身受益的同时也让朋友们在技术上有所提升。出 PDF 版的初衷一周多没有更新文章了,读者朋友们可能会怀疑我在偷懒;是的,我摊牌了...

ShiLuoHeroKing的博客 515

面试被问到Spring IOC、AOP和动态代理,用这篇文章怼过去

【原创】 码农登陆2019-03-25 19:26:28 前言 我学弟的一篇文章,非常优秀的2020届学弟。 因为不能贴相关链接,所以想要他联系方式的小伙伴,可以后台私聊我 正文 01、谈理解 首先你要知道,Spring框架原理基本是Java岗面试必问的问题。偶尔会扩展到Spring mvc框架,不过一般很少。每当面试官向你提问,让你说一下Spring的框架原理,你必须...

u011277123的博客 5075

Spring IoC及AOP源码笔记分享

记得还是两三年前试着阅读过spring的源码,但没有方式方法,导致迷失在浩瀚的代码行中,似懂非懂。 最近又开始阅读学习spring的源码,这次的方法是视频+博文的方式+不断的代码调试,终于见得庐山真面目。 下面推荐田小波的spring源码系列,确实不错。本文记录已做收藏。 Spring 源码分析文章列表 Ⅰ. IOC 更新时间 标题 2018-05-30 Spring IOC 容器源码分析系列文章导读 2018-06-01 Spring IOC 容器源码分析 - 获取单例 bean 2018-06-04 S

IccBoY_超越 359

【手写框架】2. Spring IOC 和 AOP

手写spring的IOC 和 AOP框架 我们都知道spring 框架的核心就是IOC 和AOP,但是直接翻阅源码对于刚开始用spring的小伙伴会有些难度,所以这里我们实现一个简单的手写IOC 和 AOP来帮助小伙伴们更好的理解spring的底层实现。 我们使用一个模拟用户转账的场景来实现IOC 和 AOP 我们先来看下项目的整理调用流程图 我们对这张图来进行一下简单的分析 beans.xml 配置我们的bean对象 Beanfactory 用来解析bea

快乐小码农的博客 264

框架Spring学习笔记(IOC,AOP)

Spring学习Spring概述IOC学习1.1什么是IOC1.2IOC详解AOP学习1.1什么是AOP1.2AOP作用和优势1.3AOP相关术语1.4相关注解1.5切入点表达式 Spring概述 介绍:Spring框架是企业使用最多的框架,没有之一。Spring是一站式框架,称之为一站式框架的原因是Spring可以整合其他框架。 学习目标: Spring IoC:对象工厂及依赖注入; Spring AOP:面向切面编程技术,为Spring事务管理打下基础。 Spring Transaction mana

v3424的博客 475

Spring源码解析系列汇总

相信我,你会收藏这篇文章的 本篇文章是这段时间撸出来的Spring源码解析系列文章的汇总,总共包含以下专题。喜欢的同学可以收藏起来以备不时之需 SpringIOC源码解析(上) 本篇文章搭建了IOC源码解析的demo环境,启动这个环境即可开启阅读Spring源码的第一步 开始源码阅读时介绍了Spring容器中最经典的容器ClassPathXmlApplicationContext,这个...

Java学习录 1459
上一篇: Redis为什么快,以及雪崩、穿透的解决方案
秃头选拔赛世界先生
博客等级 码龄9年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值