浅谈 Spring IOC和AOP

浅谈 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内部都帮我们定义好了,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值