spring入门——关于aop和ioc(一)

Spring的概念

spring是一个开源轻量级框架,通俗的解释一下,开源:也就是免费;轻量级:不需要依赖很多其他的东西,比如一些容器,可以提高开发调试的效率。

spring的核心两部分:

(1)aop:面向切面编程

(2)ioc:控制反转


什么是AOP?

这里先解释一下OOP(Object-Oriented Programing,面向对象编程),相信大家对面向对象语言(Object-Oriented Language)不陌生吧,现在我们学的大多数程序设计语言都是面向对象语言,比如c++,java等。不管是OOP还是OOL,核心都在于面向对象,面向对象的特点是继承、封装和多态。面向对象建立了一种对象层次结构用来模拟公共行为的一个集合,是一种子类继承父类这样的从上至下的关系(纵向机制),当需要为分散的对象引入公共行为的时候,OOP将显得无能为力。例如日志功能,日志往往水平地散布在所有对象层次中,与功能没有关系,若是采用OOP设计,将导致大量代码重复,不利于各个模块的重用。因此,aop出现了,aop采用横向抽取机制,在运行时,动态的将代码切入到类的指定方法、指定位置上。

这里引入一张图来讲解。


纵向机制:将写日志功能抽取出来单独封装到基类(父类)BaseUser中,这样每次要写日志调用父类的方法就可以了,这样避免了每次写日志都要写添加日志逻辑的代码。但是有一个新的问题,如果有10个子类都调用了写日志方法,而这个时候基类的写日志方法要修改,那么10个调用了此方法的子类都要修改,同样不利于代码的维护(耦合高)。

横向机制:比如说上图的User类(实现了BaseUser接口,如下图),若想要增加写日志的功能不再调用父类的方法,而是使用动态代理方式创建一个和User平级的接口实现类代理对象(并不是真正的对象)。


AOP操作术语

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

Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
(在类里面方法可以被增强,而实际操作中被增强的方法称为切入点)
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
(增强的逻辑,比如添加日志功能,这个功能就是增强)
Aspect(切面): 是切入点和通知(引介)的结合
(把增强用到切入点的过程就是切面)
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象(要增强的类)
Weaving(织入):是把增强应用到目标的过程.
把advice 应用到 target的过程

Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类

什么是IOC?

Ioc—Inversion of Control,即“控制反转”。用一个例子来解释,比如一个类A要调用类B里面的非静态方法,我们传统的做法是new一个B对象再调用方法,形如 B b=new B();这样导致了类与类之间的高耦合,维护修改代码很困难。而控制反转的核心是: 对象的创建不是通过new方法实现,而是交给spring配置创建对象。即IOC容器 控制了对象,容器创建及注入依赖对象,对象只是被动的接受依赖对象,所以是 反转

IOC底层原理

相关技术:

1、xml配置文件

2、dom4j解析xml

3、工厂设计模式

4、反射

一个例子:

比如此时有一个用户业务UserService类,还有一个Controller:UserServlet,UserServlet中要得到UserService的对象。

第一步:创建xml配置文件,配置要创建的对象类

<bean id="userService" class="cn.spring.UserService"/>

第二部:创建工厂类,使用dom4j解析配置文件+反射获得对象

//工厂类负责生成UserService对象
public static UserService getService(){
    //1、使用dom4j解析xml文件
    //根据id值得到对应class属性的值
    String classValue="class属性值";
    //这里classValue=cn.spring.UserService
    //2、使用反射创建类对象
    Class clazz=Class.forName(classValue);
    //创建对象
    UserService service=clazz.newInstance();
    return service;
}

然后就可以在UserServlet中调用此方法创建对象了

public class UserServlet{
    UserFactory.getService();
}

AOP与IOC详细的使用将在后文中提到。



原文出自:https://my.csdn.net/qq_37094660(如需转载请注明出处)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值