Spring框架基本理解(2)

Spring框架的另一大核心:AOP(面向切面编程),将那些与业务无关,却为业务模块所共同调用的逻辑(例如事务处理、日志管理、权限控制等)封装抽取成一个可重用的模块,这个模块被命名为“切面”(Aspect),便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

一、Spring AOP 基于动态代理实现

1、如果被代理的对象,已经实现某个接口,则 Spring AOP 会使用 JDK Proxy(反射),基于接口的方式,创建代理对象(JDK动态代理的核心是InvocationHandler接口和Proxy类)

2、如果被代理的对象,没有实现某个接口,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib,基于继承的方式,生成一个被代理对象的子类来作为代理(Cglib动态代理的核心是MethodInterceptor接口和Enhancer类).

二、AOP知识点

1、AOP通知类型(ApectJ AOP)

AOP将抽取出来的共性功能称为通知;通知类型:以通知在上下文中的具体位置作为划分:

前置通知(Before):目标方法调用前,执行通知。

后置通知(After):目标方法调用之后,执行通知(写在finally方法中)。

返回通知(After-returning): 方法正确执行后,执行通知。

异常通知(After-throwing):在方法抛出异常时,执行通知。

环绕通知(Around):是一个围绕目标方法的通知。

2、AOP连接点(Join point)

AOP将所有的方法都视为连接点,不管是接口里面的抽象方法,还是实现类里面的重写方法,都是连接点。

3、AOP切点(Pointcut)

 AOP将可能被抽取共性功能的方法称为切入点。切入点是连接点的子集。

4、AOP目标对象(Target)

就是挖掉功能的方法对应的类生的对象,这种对象是无法直接完成最终工作的。

5、AOP织入(Weaving)

就是将挖掉的功能回填的动态过程。

6、AOP 切面

切面是由一个或多个通知(Advice)组成的,通知定义了在程序执行的哪个时间点和地点执行特定的操作;切面还包括切点(Pointcut),切点定义了在程序中哪些位置应用通知。

三、切点表达式配置语法:

execution(修饰符 返回值 包名称.类名称.方法名称(参数列表))

例:execution(public void com.apesource.service.ServiceImp.findAll())

1.修饰符可以省略代表任意

    execution(返回值 包名称.类名称.方法名称(参数列表))

2.返回值可以使用“*”代表任意

    execution(* 包名称.类名称.方法名称(参数列表))

3.包名可以使用“*”代表任意名称

    execution(* *.*.*.类名称.方法名称(参数列表))

4.包名可以使用“..”代表任意个数

    execution(* *...类名称.方法名称(参数列表))

5.类名与方法名可以使用“*”代表任意

    execution(* *...*.*(参数列表))

6.参数列表可以使用".."代表任意个数任意类型

    execution(* *...*.*(..))

    如果有参数:int--->int;String--->java.lang.String

四、Bean的生命周期

1、Bean的实例化

读取xml配置文件,每个bean变成一个BeanDefinition信息对象,存放入Map集合中,然后,从Map集合取出每个bean对象,执行后工厂处理器(BeanFactoryPostProcessor、BeanDefinitionRegistryPostProcessor、BeanPostProcessor),最终,创建出一个”半成品”的bean实例。

2、Bean的初始化

是将”半成品”的bean实例变成”成品”的bean实例的一个过程。分为以下几个步骤:

作属性赋值(有三个场景:一是基本数据字符串和复杂类型;二是单向对象;三是双向循环依赖);

Aware接口(BeanFactoryAware、BeanNameAware、ApplicationContextAware、ServletContextAware):当前类实现哪个接口,就执行此接口对应的方法,没有实现接口,就不用执行此步骤;后处理器的before();接口初始化(实现InitializingBean,重写afterPropertiesSet()),属性初始化(在bean标签中加入属性init-method);后处理器的after();变成一个完整的bean对象,存放到singletonObjects一级缓存中。

3、操作使用

用户通过getBean()拿到bean对象。

4、销毁阶段

接口销毁(实现DisposableBean,重写destroy())、属性销毁(在bean标签中加入属性destory-method)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值