浅谈 Spring IOC和AOP

IOC 控制反转

  • 以前创建对象的主动权和时机是由于自己把握的,现在将这种权利转移到Spring容器中,并且根据配置文件去创建对象管理对象
  • ioc的注入方式有三种:构造器注入,setter方法注入,根据注解注入
  • 在Spring里面,主要提供了BeanFactory和ApplicationContext两种IOC容器,通过他们来实现Bean的管理

IOC和DI(依赖注入)

  • IOC(控制反转):以前创建对象的主动权和时机是由于自己把握的,现在将这种权利转移到Spring容器中,并且根据配置文件去创建对象管理对象
  • DI(依赖注入) :自身对象中的内置对象是通过注入的方式进行创建。

IOC和DI 的关系

ioc就是容器,di就是注入的这一行为,那么di确实就是ioc的具体功能实现,而ioc则是di发挥的平台和空间,所以说ioc和di是相辅相成的,最重要的是,他们都是为了解耦——(解耦的概念)解除或降低模块之间的耦合关系

DI怎么实现的

依赖注入可以通过setter方法注入,构造注入,接口注入三种方法来实现。
Spring 支持setter注入和构造器注入,通常视同构造器注入来注入必须的依赖关系,对于可选的依赖关系,则setter方法注入是更好的选择setter方法注入需要类提供无参构造器或者无参的静态工厂方法来创建对象。

Spring的依赖注入的底层原理:
首先,Spring会根据当前Bean对象先找出这个对象中那些加了@AutoWrited注解的属性,然后根据属性的类型从Spring容器里面中找出Bean对象,如果只找到一个则就把这个对象赋值给当前这个属性,如果根据类型找到多个,那么在根据属性名字找到其中一个,因为这个Bean的beanName都是不一样的。如果根据属性名没有找到Bean对象,则看@AutoWrited注解的require属性,如果为true,则报错,否则赋值null;其他构造方法注入,set方法注入也类似,不过是根据入参类型和名字找Bean,找到之后调用方法传进去即完成依赖注入。

FactoryBean和BeanFactory的区别

  • BeanFactory是Bean的工厂,ApplicationContext的父类,IOC的核心,负责生产和管理Bean对象
  • FactoryBean是Bean,可以通过实现FactoryBean接口定制实例化Bean的逻辑,通过代理一个Bean对象,对方法前后做一些操作

Spring Bean 的生命周期

SpringBean生命周期简单概括为4个阶段:

  1. 实例化,创建一个Bean对象
  2. 填充属性,为属性赋值
  3. 初始化: 如果实现了xxxAWare接口,通过不同类型的AWare接口拿到Spring容器的资源, 如果实现了BeanPostProcessor接口,则会调用接口的postProcessBeforeInitialzation和postProcessAfterInitialzation方法, 如果配置了init_method方法,则会执行init-method配置的方法
  4. 销毁: 容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destory方法。如果配置了destroy-method方法,则会执行destroy-method配置的方法

AOP 面向切面编程

作为面向对象的一个补充,在不影响源码的情况下进行对原有的功能补充
可以通过预编译方式和运行动态代理实现不修改源码的情况下给程序动态统一添加功能的技术

AOP 底层实现是什么? 有什么区别

jdk动态代理

  • 实现invocationHandle接口和Peoxy类
  • invocationHandle通过invoke反射
  • 目标类中的代码,将业务代码和追加的代码编织在一起实现
  • Proxy利用InvocationHandle动态创建一个符合某一接口的实例,生成目标类的代理对象

CGLib动态代理

  • 当代理类没有实现invocationHandle接口,SpringAOP对强制将代理方式切换成CGLib,动态生成指定类的子类对象,并且重新业务覆盖特定方法,从而实现AOP,当是这个类不能被final修饰

CGLib是基于asm第三方框架,通过修改字节码生成成一个子类,然后重写父类的方法,实现对代码的增强。

ASM 是一个 Java 字节码操控框架。它能被用来动态生成类或者增强既有类的功能。ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态改变类行为

AOP在项目中的使用场景

  1. 日志记录,跟踪,优化和监控
  2. 事务的处理,性能的优化
  3. 资源池管理 如数据库资源池的管理
  4. 系统统一认证,权限管理
  5. 应用系统的异常捕捉及处理
  6. 提高代码的模块化能力,同时也是解耦。

Spring主要提供了Aspect切面,JoinPoint连接点,PointCut切入点,Advice增强等实现方式

Spring AOP 和AspectJ AOP的区别

  • Spring AOP基于动态代理实现,属于运行时增强
  • Aspect JAOP则属于编译时增强,主要有3总方式:
    • 编译时织入:指增强的代码和源码我们都有,直接使用AspectJ编译器编译就行了,编译之后生成一个类,他也会作为一个正常的java类装载到Jvm
    • 编译后织入:指代码已经被编译成class文件或者已经打包成jar包,这是要增强的话,就是编译后织入,比如你依赖了第三方的类库,又想对他进行增强的话,就可以通过这种方式操作
    • 加载时织入:指的是在JVM记载类的时候进行织入。
      总结:Spring AOP只能在运行时织入,不需要单独编译,性能比AspectJ编译织入慢。而AspectJ只支持编译前后和类加载时织入,性能更好,功能更强大

Spring Boot自动注解

就是springboot帮程序员自动配置一些Bean。如果直接使用Spring整合一些其他框架或中间件时,除了要引入相关依赖之外,还要在定义一些相关的Bean才能使用这些框架或中间件,而使用SpringBoot则不需要定义这些Bean,因为SpringBoot内部都帮我们定义好了,

浅谈 Spring IOC和AOP相关推荐

  1. 浅谈Spring IOC的理解

    浅谈Spring IOC的理解 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊 ...

  2. 浅谈Spring IOC和DI及Spring工厂类

    浅谈Spring IOC和DI及Spring的工厂类 文章目录 浅谈Spring IOC和DI及Spring的工厂类 一. IOC 1.什么是IOC 2.为什么使用IOC 传统开发模式的弊端 3. 使 ...

  3. 浅谈 Spring IOC

    浅谈 Spring IOC 什么是IOC 理解 IOC 和 DI Spring IOC 相关操作个人总结 什么是IOC Ioc-Inversion of Control,即"控制反转&quo ...

  4. 浅谈Spring IOC

    Spring IOC 1.IOC是什么? IOC(Inversion of Control)---控制反转: IOC不是一种技术,是一种设计思想.在没有Spring IOC时,对象的创建和依赖关系是由 ...

  5. 面试中浅谈Spring IOC

    IOC控制反转.依赖注入. 借助第三方,然后实现对具有依赖关系的对象之间的解耦. 依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式 ...

  6. 浅谈:Spring Boot原理分析,切换内置web服务器,SpringBoot监听项目(使用springboot-admin),将springboot的项目打成war包

    浅谈:Spring Boot原理分析(更多细节解释在代码注释中) 通过@EnableAutoConfiguration注解加载Springboot内置的自动初始化类(加载什么类是配置在spring.f ...

  7. 由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

    由openSession.getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持,op ...

  8. 自己动手实现的 Spring IOC 和 AOP - 下篇

    1. 背景 本文承接上文,来继续说说 IOC 和 AOP 的仿写.在上文中,我实现了一个很简单的 IOC 和 AOP 容器.上文实现的 IOC 和 AOP 功能很单一,且 IOC 和 AOP 两个模块 ...

  9. 自己动手实现的 Spring IOC 和 AOP - 上篇

    1. 背景 我在大四实习的时候开始接触 J2EE 方面的开发工作,也是在同时期接触并学习 Spring 框架,到现在也有快有两年的时间了.不过之前没有仿写过 Spring IOC 和 AOP,只是宏观 ...

最新文章

  1. Java 项目JDBC 链接数据库中会出现的错误
  2. Python学习笔记系列——函数
  3. 渗透测试---数据库安全: sql注入数据库原理详解
  4. asp.net webapi 微信接口接入
  5. 专访清华大学姚期智院士:量子计算的未来
  6. 在SpringBoot2.0及Spring 5.0 WebMvcConfigurerAdapter已被废弃,目前找到解决方案就有两种...
  7. 【干货】推荐技术分享-多业务融合推荐实践与思考.pdf(附50页ppt下载链接)
  8. java 发送邮件带附件
  9. c语言第一周项目,C语言第一周实战
  10. JasperReport和iReport的java集成大全
  11. 孙鑫VC++讲座笔记(一)
  12. Android/iOS 终端快速截屏技巧
  13. 【UI】优秀的网站欣赏以及分析
  14. 华为云账号登录流程和方法
  15. 计算机英语boot,电脑开不了机显示英文boottmgr
  16. 【AtCoder】AtCoder Grand Contest 045
  17. 全要素网格化综合治理平台
  18. 深入操作系统底层分析nginx网络请求及响应过程
  19. bim计算机工程师考试,bim工程师考试报名条件是什么?bim工程师考试怎么报名?...
  20. SEO关键词排名优化教程

热门文章

  1. java毕业设计开题报告论文基于JavaWeb酒店管理系统开发与设计
  2. long类型在32位系统和64位系统的问题(android O )
  3. raw格式照片一键改变风格
  4. CentOS安装网站安全狗
  5. 多子系统多业务模块的复杂数据处理——基于指令集物联网操作系统的项目开发实践
  6. 中国高速铁路发展对交通方式转变的影响与二氧化碳减排潜力研究
  7. html css重设,typo.css
  8. 城市简码_如何使用简码在WordPress中添加Twitter Bootstrap CSS
  9. 计算机类设备资产管理,智的设备设施资产管理系统
  10. android 通知中心,你的 Android 通知中心从未如此井然有序过:个性通知