Spring_IOC/AOP


最近两天回了长沙,待在租房不能出门,复习了一下Spring框架。在Spring框架中,最重要的就是控制反转IOC和面向切面AOP,说一下自己的理解吧,权当自己做了一些笔记。

控制反转IOC

在Spring中通过IOC容器,将对象之间的依赖交由Spring进行统一控制管理,实现程序之间的解耦,IOC包括依赖注入DI和依赖查找,最常被用到的就是依赖注入,是IOC的具体表现。

在这里插入图片描述 图片来源于黑马视频

依赖注入DI

实现依赖注入一共有三种注入方式,分别是构造函数注入,Setter注入,基于注解的注入;最常被用到的就是构造函数注入和Setter注入。其中,构造函数注入和Setter注入都在在XML配置,基于注解的注入是通过注解配置。

1,构造函数注入

使用类中的构造函数,给成员变量赋值。其中,赋值的操作不是我们自己做的,而是通过配置
的方式,让 spring 框架来为我们注入。

涉及到的标签:constructor-arg
属性:
index:指定参数在构造函数参数列表的索引位置;
type:指定参数在构造函数中的数据类型;
name:指定参数在构造函数中的名称(通过这个属性确定为谁赋值);
value:它能赋的值是基本数据类型和 String 类型;
ref:它能赋的值是其他 bean 类型(必须得是在配置文件中配置过的 bean);

2,Setter注入

在类中提供需要注入成员的 set 方法,然后通过Spring框架注入
涉及的标签:property
属性:
name:找的是类中 set 方法后面的部分
ref:给属性赋值是其他 bean 类型的
value:给属性赋值是基本数据类型和 string 类型的

3,基于注解注入

Autowired:自动按照类型注入。只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功,如果ioc容器中没有任何bean的类型和要注入的变量类型匹配,则报错。在使用注解注入时,set方法就不是必须的了。

Qualifier:在按照类中注入的基础之上再按照名称注入。它在给类成员注入时不能单独使用。但是在给方法参数注入时可以。属性:value:用于指定注入bean的id。

Resource:直接按照bean的id注入,它可以独立使用。属性:name:用于指定bean的id。

Value:用于注入基本类型和String类型的数据。属性:value:用于指定数据的值。它可以使用spring中SpEL(也就是spring的el表达式), SpEL的写法:${表达式}。

还有一些必要的注解,比如@Component,@Scope等;一些非必要的注解,比如@Configuration,@ComponentScan,@PropertySource等。

在这其中,对于Bean的理解,作用范围,生命周期等就不做多说明。

面向切面AOP

面向切面AOP是面向对象OOP的延续,或者说提升,也是Spring框架中一个重要内容,把程序中重复的代码抽取出来统一管理,通过动态代理技术在不修改源码的情况下对已有方法的增强。减少了重复代码,提高开发效率。

动态代理技术,有基于接口的动态代理和基于子类的动态代理。基于接口由JDK官方的proxy类提供,要求被代理类至少实现一个接口;基于子类由第三方CGLib提供,要求被代理类不能被final修饰;而在Spring框架中选择哪一种动态代理技术,根据目标类是否实现了接口来判断。

在AOP中,有很多专业术语:
Joinpoint(连接点):指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的
连接点;
Pointcut(切入点):指我们要对哪些 Joinpoint 进行拦截的定义;
Advice(通知/增强):通知是指拦截到 Joinpoint 之后所要做的事情就是通知,包括前置通知,后置通知,异常通知,最终通知和环绕通知。
Introduction(引介):一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field;
Target(目标对象):代理的目标对象;
Weaving(织入):把增强应用到目标对象来创建新的代理对象的过程;
Proxy(代理):一个类被 AOP 织入增强后,就产生一个结果代理类;
Aspect(切面):切入点和通知(引介)的结合;

在这里插入图片描述图片来源于黑马视频

基于XML的AOP配置

注意:AOP一定要配置ioc

第一步: 把通知类用 bean 标签配置起来(通过ioc配置);
第二步: 使用 aop:config 声明 aop 配置;
第三步: 使用 aop:aspect 配置切面,其中 aop:aspect标签有属性:id: 给切面提供一个唯一标识,ref: 引用配置好的通知类 bean 的 id;
第四步: 使用 aop:pointcut 配置切入点表达式;其中aop:pointcut标签有属性:id: 用于给切入点表达式提供一个唯一标识,expression:用于定义切入点表达式;
第五步: 使用 aop:xxx 配置对应的通知类型;包括aop:before,aop:after-returning,aop:after-throwing,aop:after标签;属性包括:method: 指定通知中方法的名称,pointct: 定义切入点表达式,pointcut-ref: 指定切入点表达式的引用;

基于注解的AOP配置

第一步: 把通知类也使用注解配置;通过@Component,@Service,@Controller等注解标签;不使用XML的话,@Configuration @ComponentScan(basePackages=" ");
第二步: 在通知类上使用@Aspect 注解声明为切面;
第三步: 在增强的方法上使用注解配置通知,包括@Before,@AfterReturning,@AfterThrowing,@After;
第四步: 在 spring 配置文件中开启 spring 对注解 AOP 的支持,写法是<aop:aspectj-autoproxy/>;不使用XML的话,在类前@EnableAspectJAutoProxy;

注意:直接在增强方法上使用注解配置通知,有时会因为最终通知和后置通知顺序问题,导致操作报错失败。这时候,建议使用环绕通知@Around,spring中的环绕通知是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式。 而且Spring框架为我们提供了一个接口:ProceedingJoinPoint,该接口有一个方法proceed(),此方法就相当于明确调用切入点方法。 该接口可以作为环绕通知的方法参数,在程序执行时,spring框架会为我们提供该接口的实现类供我们使用
如下:
在这里插入图片描述

实例化bean的三种方式:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

闲谈 :今天看到一句很棒的话:“没有人能藏得住冬天长的肉,就像,没有人能够掩盖偷偷补了课。”

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值