使用过 Spring 的同学应该都接触过 BeanFactory 和 ApplicationContext,其实它们就可以看做 Spring IoC 容器的具体表现形式,了解这两者的区别与联系对于我们理解和使用 IoC 容器是比较重要的。我们先来看一下 IoC 容器的接口设计图:
站在用户的角度思考问题,与客户深入沟通,找到密山网站设计与密山网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、做网站、企业官网、英文网站、手机端网站、网站推广、申请域名、网站空间、企业邮箱。业务覆盖密山地区。
下面我们来对这张接口设计图做一下解析:
我们通过以上的接口设计图跟分析可以看出,整个 Spring IoC 容器就是以 BeanFactory 和 ApplicationContext 作为核心的。BeanFactory 定义了 IoC 容器的基本功能,而 ApplicationContext 体系则在 BeanFactory 基础上通过继承其他接口来实现高级容器特征。下面我们来看一下这两个体系的应用场景:
到此为止,我们大概了解了 IoC 容器的概念跟 Spring 中对于 IoC 容器的设计跟应用,之后我们要详细的分析 IoC 容器的初始化、依赖注入跟其他相关特征的设计与实现等。
1、ioc原理:
在传统的实现中,由程序内部代码来控制组件之间的关系。需要使用new关键字来实现两个组件之间关系的组合,这种实现方式会造成组件之间耦合。IoC很好地解决了该问题,它将实现组件间关系从程序内部提到外部容器,也就是说由容器在运行期将组件间的某种依赖关系动态注入组件中。
对象A依赖于对象B,当对象A需要用到对象B的时候,IoC容器就会立即创建一个对象B送给对象A。IoC容器就是一个对象制造工厂,需要什么,它会给提供,直接使用即可,而不用考虑所用的东西是如何制成的,也不用考虑最后是怎么被销毁的,这一切全部由IOC容器包办。
2、aop原理:
AOP将业务逻辑组件和切面类都加入到容器中,负责在业务逻辑运行的时候将日志进行打印,切面类负责动态感知MathCalculator.div运行到哪里然后执行。通过@Aspect通知注解给切面类的目标方法标注何时何地运行。
在程序创建之前会根据切入点表达式对增强器进行一一匹配,最终拿到所有的增强器。创建代理对象过程中,会先创建一个代理工厂,获取到所有的增强器(通知方法),将这些增强器和目标类注入代理工厂,再用代理工厂创建对象。
扩展资料:
AOP的组成:
1、方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。
2、连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
3、通知(Advice):在特定的连接点,AOP框架执行的动作。各种类型的通知包括“around”、“before”和“throws”通知。通知类型将在下面讨论。许多AOP框架包括Spring都是以拦截器做通知模型,维护一个“围绕”连接点的拦截器链。
4、切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。AOP框架必须允许开发者指定切入点:例如,使用正则表达式。
5、引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。Spring中要使用Introduction,可有通过DelegatingIntroductionInterceptor来实现通知,通过DefaultIntroductionAdvisor来配置Advice和代理类要实现的接口
6、目标对象(Target Object):包含连接点的对象。也被称作被通知或被代理对象。POJO
7、AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
8、织入(Weaving):组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。
IOC容器:Ioc—Inversion of Control,即“控制反转”,就是具有依赖注入功能的容器,是可以创建对象的容器,IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
IoC 的全称叫做 Inversion of Control,可翻译为为「控制反转」或「依赖倒置」,它主要包含了三个准则:
1、高层次的模块不应该依赖于低层次的模块,它们都应该依赖于抽象;
2、抽象不应该依赖于具体实现,具体实现应该依赖于抽象;
3、面向接口编程 而不要面向实现编程。
扩展资料
Spring 提供了许多 IOC 容器
的实现。比如 XmlBeanFactory,ClasspathXmlApplicationContext 等。其中 XmlBeanFactory 就 是针对最基本的IOC 容器的实现,这个 IOC 容器可以读取XML 文件定义的 BeanDefinition(XML 文件中对 bean 的描述)。
ApplicationContext 是 Spring 提供的一个高级的 IOC 容器,它除了能够提供 IOC 容器的基本功
能外,还为用户提供了以下的附加服务。
参考资料来源:百度百科-IOC
IOC,即控制反转(Inversion of Control,英文缩写为IoC),是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
IOC的优点:实现组件之间的解耦,提高程序的灵活性和可维护性。
IOC的缺点:
1、创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。
2、因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。
3、缺少IDE重构的支持,如果修改了类名,还需到XML文件中手动修改,这似乎是所有XML方式的缺憾所在。
IOC的应用:
IOC模式将耦合代码从程序中移出,放到统一的XML文件中管理。由IOC容器通过配置文件来管理对象的生命周期、依赖关系等,这样就不用重新修改并编译具体的代码,从而实现组件之间的解耦。