spring ioc 、di、aop 理解

spring IOC
原理:一般指代码的实现以及涉及到的技术
1.以XML的形式来说
        -->涉及到xml的解析技术 以及 反射机制
          1) xml解析技术 包括dom4j  以及jdom dom4j支持xpath。。。功能更强大 推荐使用
          2) 反射机制  首先的获得了wide全路径 该类还得有构造器如果你要是写了有参构造器的话,必须的显示无参构造器。默认情况下,该类式自带无参构造器。
    然后Class.forName("xxx.xxx.xxx.User").newInstance会构建一个实例 利用无参构造器。
          3) 容器
                    特点:根据唯一标识 获取该实例
                    如何构建一个容器(容器的底层数据结构):采用Map集合构建承载容器(实例以ID)的角色
 
 
  2:以注解的形式来说
           1)利用反射的机制获得注解 进行该对象的实例化
             
IOC 和 DI
谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
IOC:控制反转
     控制:指的是构建实例的控制权 以前构建实例的方法是由其他类(引用类)new出来 此时实例的控制权为引用类。现在有了spring,构建实力的权力交给spring接管
     反转:控制权有其他类(引用类)转为spring
DI:依赖注入
依赖:指的是A类要引用B类 那么A依赖B
注入:A既然依赖B 那么B类何时初始化?为了解决耦合度的问题 不能再A类中new  B,得靠spring将B类的实例传递给A 该过程叫注入
 
DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
耦合度:A依赖B才能玩咸亨特定的功能。该B为一个接口,实现类有u东哥BImpl_1 BImpl_2各有不同。
以前A可以直接使用BImpl_1那么我们说A与BImpl_1紧密俩你想在一起了。耦合度很高。
现在A依赖BImpl_1的接口即B,B接口的实现有spring类来控制注入BImpl_1或者BImpl_2。即A与BImpl_1实现了解耦。
多态:多种表现形式。
IOC和DI的区别
   先有IOC 将实例构建出来 才能DI
 
 
谁依赖于谁:当然是应用程序依赖于IoC容器;
为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;
谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;
 
●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
 
IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
—————————————————————分割线 ———————————————————————
 
代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
按照代理的创建时期,代理类可以分为两种
静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 
动态代理:在程序运行时,运用反射机制动态创建而成。
动态代理:针对的是接口
cglib代理:是对被代理对象的继承
代理机制: * Spring 的 AOP 的底层用到两种代理机制: * JDK 的动态代理 :针对实现了接口的类产生代理. * Cglib 的动态代理 :针对没有实现接口的类产生代理. 应用的是底层的字节码增强的技术 生成当前类 的子类对象.
 
静态代理的每一个代理类只能为一个接口服务,这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码。解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,那么此时就必须使用动态代理完成。 
 
动态代理与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。 
为什么用AOP:
* AOP 解决 OOP 中遇到的一些问题.是 OOP 的延续和扩展.
对程序进行增强:不修改源码的情况下. * AOP 可以进行权限校验,日志记录,性能监控,事务控制.
 
AOP的开发中的相关术语:
      Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只 支持方法类型的连接点.(目标对象中,所有可以增强的方法
     Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义. 目标对象中,已经增强的方法。《已经发生》)  
     Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知.通知分为前置通知,后置 通知,异常通知,最终通知,环绕通知(切面要完成的功能)。 (增强的代码<比如system.out.println("")>
     Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下,   Introduction 可以在运行期为类 动态地添加一些方法或 Field. 
     Target(目标对象):代理的目标对象 (目标对象
     Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程. spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装在期织入。(将通知织入切入点的过程
     Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类 。(将通知织入到目标对象之后,形成代理对下对象
     Aspect(切面): 是切入点和通知(引介)的结合。(切入点+通知
通知类型:
前置通知 :在目标方法执行之前执行. 
后置通知 :在目标方法执行之后执行 
环绕通知 :在目标方法执行前和执行后执行 
异常抛出通知:在目标方法执行出现 异常的时候 执行 
最终通知 :无论目标方法是否出现异常 最终通知都会 执行.
 
 
 
原文地址:https://www.cnblogs.com/Iron-1995/p/14450041.html