SpringIOC和SpringAOP

IOC即“控制反转”,不是什么技术,而是一种设计思想。IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。Ioc将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。低耦合,方便测试,高复用。

控制什么?在传统的Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IOC是有专门一个容器来创建这些对象,既由IOC容器来控制对象的创建。IOC容器控制了对象,主要控制了外部资源获取。

反转什么?有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是有容器来帮忙创建及注入依赖对象。因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转。

 

 

IOC依赖注入DI(Dependency Injection)这种方式来实现控制反转。它就是把底层类作为参数传入上层类,实现上层类对下层类的“控制”。

谁依赖谁?:当然是应用程序依赖于IOC容器

为什么需要依赖?:应用程序需要IOC容器来提供对象需要的外部资源

谁注入谁?:很明显是IOC容器注入应用程序某个对象,应用程序依赖的对象

注入了什么?:就是注入某个对象所需要的外部资源

四,代理模式

为什么要学习代理模式?因为这是SpringAOP底层

为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理信息,过滤信息,传递信息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。

代理类为被代理类处理消息,过滤消息并在此之后将消息返回给代理类,之后还能进行消息的后置处理。代理类和被代理类通常会存在关联关系,代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。

1.静态代理

缺点:静态代理只能为一个类服务,如果代理类很多,那么就需要编写大量的代理类过于繁琐;当接口中功能增加或者修改,会影响众多的实现类,代理类要改。

2.动态代理

动态代理机制在运行时创建代理类,动态代理的代理类是动态生成的。动态代理的实现方式常用的两种:使用JDK代理,通过CGLIB动态代理。

1,JDK动态代理:基于java的反射机制实现的,使用jdk中接口和类实现代理对象的动态创建。JDK的动态要求目标对象必须实现接口。在java.lang.reflect包(反射包)

参数:public object invoke(Object proxy,Method method,object[] avgs)【Object proxy:创建的代理对象;Method method:被代理类中的方法;object[] avgs:被代理类的方法参数类型】

Proxy类:核心的对象,创建代理对象

参数:Prox.newProxyInstance(classloader loader,class<?>[] interfaces,invocationhandler)【第一个:类加 载器;第二个:接口;第三个:自己写的生成代理类的,返回值代理对象】

实现步骤:

1.创建类继承invocationhandler接口(一个方法invoke():表示代理类要执行的功能写在这里)

2.通过Proxy类(指定ClassLoader对象和interface)创建代理类

3.处理代理实例,并返回结果(通过反射机制获取动态代理类的构造函数,参数类型是通用处理器接口类型)

4.通过构造函数创建动态代理实例,构造时调用真实角色对象,porxy调用被代理方法

2,cglib动态代理:cglib是第三方的工具库,创建代理对象

cglib的原理是继承,cglib通过继承目标类,创建它的子类的代理对象

在子类中重写父类(要求目标类不能为final的,方法也不能为final的)中间名的方法,实现功能的修改

效率高于jdk

五,Spring AOP

(1)面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

(2)通俗描述:不通过修改源代码方式,在主干功能里面添加新功能。

(3)使用登陆例子,添加权限说明AOP。

AOP底层使用动态代理

1.有接口(jdk动态代理)

创建接口实现类代理对象,增强类的方法

 

2.无接口(cglib动态代理)

创建子类的代理对象,增强类的方法

 

(1)连接点:类里面哪些方法可以被增强,这些方法称为连接点

(2)切入点:实际被真正增强的方法,称为切入点

(3)通知(增强):实际增强的逻辑部分称为通知,通知有多钟类型(前置通知,后置通知,环绕通知,异常通知,最终通知)

(4)切面:是动作,把通知应用到切入点过程

Spring框架一般都是基于AspectJ实现AOP操作,AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spring框架一起使用,进行AOP操作

什么是AspectJ

AOP是OOP的延续

“横切”的技术,刨解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为“Aspect”,即切面,“切面”简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

使用“横切”技术,AOP把软件系统7分为两个部分

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值