ioc aop

1:控制反转(Inversion of Control,缩写为IoC),

   是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

 

2:Spring的IOC支持的功能:

  1、依赖注入

  2、依赖检查

  3、自动装配

  4、支持集合

  5、指定初始化方法和销毁方法

  6、支持回调某些方法(需要实现Spring接口,略有侵入性)

 

3:ApplicationContext  BeanFactory 

在Spring IoC 容器的设计中,有两个主要的容器系列,一个是实现BeanFactory 接口的简单容器系列,这系列容器只实现的容器的基本功能;另一个是ApplicationContext 应用上下文,它作为容器的高级系列而存在。应用上下文在简单容器的基础上,增加了许多面向框架的特性,同时对应用环境做了许多适配。有了这两种基本的容器系列,基本上就可以满足用户对IoC 容器使用的大部分需求了。

我们可以发现BeanFactory 是作为一个最基本的接口类存在于Spring IoC 容器体系中的。这个继承结构图可以作为参考,下面主要介绍BeanFactory与 ApplicationContext

BeanFactory 详解

BeanFactory 接口定义了IoC 容器的最基本形式,并且提供了IoC 容器所应该遵守的最基本的服务契约。同时,这也是IoC 容器所应该遵守的最底层和最基本的编程规范,勾勒出了最基本的IoC 容器轮廓。很显然BeanFactory 只是一个接口,所以并没有给出方法的实现。在Spring 中,所有的Bean 都是由BeanFactory 来进行管理的。

spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说,DefaultListableBeanFactory 是整个spring ioc的始祖。

BeanFactory 中设计了getBean() 方法,这个方法是IoC 容器API 的主要方法,通过这个方法,可以获取到由IoC 容器所管理的Bean。通过上面的图我们可以知道,BeanFactory 支持多种方式获取Bean。下面来具体了解一下其中一些方法的作用。

containsBean() :可以让用户判断容器中是否含有指定名字的Bean。
isSingleton() :查询指定名字的Bean 是不是单例的。默认情况下,Spring IoC 容器中的Bean 是单例的。用户可以在BeanDefinition 中指定。
isPrototype():查询指定名字的Bean 是不是原型的。与isSingleton() 方法类似。
isTypeMatch():用来查询指定名字的Bean 的Class 类型是否是特定的Class 类型。
getType():获取指定名字的Bean 的Class 类型。
getAliases():获取指定名字的Bean 的所有别名。这些别名可以在BeanDefinition 定义。
这些定义的接口方法规划了IoC 容器的基本特征。BeanFactory 允许使用不同的方式来检索Bean,从而将以前用户自己创建与管理Bean 的方式中解放出来。这些检索方法是Spring IoC 容器的最基本的入口。
---------------------

过程分析:

创建IoC 配置文件的抽象信息,这个抽象资源包含了BeadDefinition 的定义信息。
创建一个BeanFactory,这里以DefaultListableBeanFactory 为例。
创建一个BeadDefinition 的读取器,通过一个回调配置给BeanFactory。
从定义好的资源位置读取配置信息,具体的解析过程由XmlBeanDefinitionReader 对象来完成。在完成载入和注册Bean之后,需要的IoC 容器就建立起来了。这时候就可以直接使用了。

ApplicationContext介绍

如果说BeanFactory是Sping的心脏,那么ApplicationContext就是完整的身躯了。

在Spring 中,系统已经为用户提供了定义好的容器的实现,从而简化我们的开发。相比那些简单扩展BeanFactory 的基本IoC 容器,我们常用的是AppliCationContext,它除了提供了前面介绍的基本IoC 容器功能外,还提供了一些附加功能,因此让用户更方便的使用。

 
ApplicationContext常用实现类作用
AnnotationConfigApplicationContext 从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式。
ClassPathXmlApplicationContext 从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式。
FileSystemXmlApplicationContext 从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件。
AnnotationConfigWebApplicationContext 专门为web应用准备的,适用于注解方式。
XmlWebApplicationContext 从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。

 

 

AOP是怎么实现的,有几种方式

AOP有三种植入切面的方法:
其一是编译期织入,这要求使用特殊的Java编译器,AspectJ是其中的代表者;
其二是类装载期织入,而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者;
其三为动态代理织入,在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。

Spring AOP使用了两种代理机制,
一种是基于JDK的动态代理,
另一种是基于CGLib的动态代理,
之所以需要两种代理机制,很大程度上是因为JDK本身只提供基于接口的代理,不支持类的代理。

五种通知: 
@Before:前置通知,在方法之前执行。 
@After:后置通知,方法之后执行。 
@AfterReturning:返回通知,方法返回结果后执行。 
@AfterThrowing:异常通知,在方法抛出异常之后。 
@Around:环绕通知,围绕方法执行。

 

 



真正实现类的逻辑包含在getbean方法中 该方法返回的是proxy的实例,proxy实例是通过spring jdk proxy 或者CGLIB生成的
jdk proxy是通过类的反射实现的 在生成代理类比较高效,CGLIB是通过ASM实现的 在生成代理之后的执行过程比较高效
posted @ 2019-06-27 17:50  zhangniuniu  阅读(267)  评论(0编辑  收藏  举报