Spring aop 和 ioc 介绍一下
Ios:容器概念、控制翻转,依赖注入
1.ioc容器:实际上就是map(key,value),里面存放的是各种对象(在xml里面配置的bean节点、@repository,@service,@controller,@compent)在项目里启动的时候会读取配置文件里面的bean节点,创建对象到map里面
2.控制翻转:没有引入ioc容器之前,对象a依赖b,那么对象a会主动去创建对象b或者使用已经创建好的对象b,这时候控制器再自己的手上吗,引入ioc容器后,对象a,b失去了联系,对象a需要b的时候,ioc容器会主动创建一个对象b注入到对象a中,这样控制权就颠倒了
3.依赖注入:获得依赖对象的过程被翻转了。就是再ioc运行期间,动态地将某种依赖关系注入到对象中。
谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了
在spring IOC容器的代表就是org.springframework.beans包中的BeanFactory接口,BeanFactory接口提供了IOC容器最基本功能,而
org.springframework.context包下的ApplicationContext接口扩展了BeanFactory,还提供了与Spring AOP集成,国际化处理,事件传播及提供不同层次的context实现。简单说,BeanFactory提供了IOC容器最基本功能,而ApplicationContext则增加了更多支持企业级功能支持。ApplicationContext完全继承BeanFactory,因而BeanFactory所具有的语义也适用于ApplicationContext。
AOP(面向切面编程)是一种编程范式,它通过将应用程序分解为核心功能和横切关注点(如安全性、事务管理、日志记录等)来提高代码的可维护性和复用性。 AOP 可以让开发人员专注于应用程序的核心业务逻辑,而不必担心横切关注点的实现。AOP 通过在程序执行期间动态地将横切关注点织入到核心功能中来实现其功能。
AOP 的实现方式包括基于代理的方式和基于字节码的方式。常见的 AOP 框架包括 Spring AOP、AspectJ 等。
Spring AOP 是一个基于代理的 AOP 框架,它提供了声明式 AOP 和编程式 AOP 两种方式。在 Spring AOP 中,开发人员可以使用注解或 XML 配置文件来声明切点(Pointcut)、通知(Advice)、切面(Aspect)等 AOP 相关概念,从而将横切关注点织入到应用程序中。
AspectJ 是一个基于字节码的 AOP 框架,它提供了更为强大和灵活的 AOP 功能。AspectJ 不仅支持 Spring AOP 中的切点表达式,还支持自定义注解、AspectJ 自己的切点表达式、织入位置的控制等高级功能。AspectJ 可以在编译期间或者运行期间进行切面织入,可以直接操作字节码,因此更为强大和灵活。
总之,AOP 是一种用于提高代码可维护性和复用性的编程范式,它可以将横切关注点(如安全性、事务管理、日志记录等)与应用程序的核心业务逻辑分离开来,从而降低代码的耦合度。常见的 AOP 框架包括 Spring AOP、AspectJ 等。
Ioc 和DI(依赖注入)的区别:
Ioc是站在对象的角度,对象实例化及其管理的权利交给了容器
DI是站在容器的角度,容器会把对象依赖的其他对象注入,比如A对象实例化过程中因为申明了一个B类型的属性,那么就需要容器吧B对象注入给A