Spring 的 IOC 和 AOP

Spring IOC

什么是IOC?

控制反转解释:
控制:指的是对象创建(实例化、管理)的权利
反转:控制权交给外部环境了(spring框架、IoC容器)

与传统开发方式相比在IOC的思想开发方式下,当类A需要以来类B时,我们不要自己去new对象了,而是由IOC容器帮我们实例化对象并且去管理它,我们需要什么对象直接从IOC容器中获取即可,由此我们可以省去创建和管理对象的一系列事情,也丧失了创建、管理对象的权力。

IOC解决了什么问题

IoC解决对象之间的耦合问题,例如当service层调用dao层时,传统方式下我们需要在service中new出dao层的具体实现类,这时当我们实现类需要改变时,service层也需要做相应的改变,这就造成了service层和dao层的强耦合。

IOC和DI的区别

IOC和DI(依赖注入)其实描述的都是对象实例化和依赖关系维护这同一件事情,只是角度不同。IOC是站在对象的角度,对象的实例化和管理交给了容器(反转);DI是站在容器的角度,容器会把对象所依赖的对象注入,例如A对象在实例化的过程中声明了B对象,那么容器就会把B对象注入给A。

依赖注入的相关注解?

@Autowired :自动按类型注入,如果有多个匹配则按照指定的Bean的id查找,查找不到会报错。
@Qualifier :在自动按照类型注入的基础上再按照Bean的id注入,给变量注入时必须搭配@Autowired,给方法注入时可单独使用。
@Resource:直接按照Bean的id注入,只能注入Bean类型。
@Value:用于注入基本数据类型和String类型

Spring AOP

AOP: Aspect oriented Programming ⾯向切⾯编程/⾯向⽅⾯编程,AOP是OOP的延续。
OOP的三大特征: 封装、继承和多态
opp思想是一种垂直纵向的继承体系,解决了代码开发中的大多数代码重复问题,例如当我们由三个类(pig、dog和cat),其中每个类中都有相同的方法(eat(); run();),那么未来避免代码重复,oop思想下我们就可以提取父类(animal),在父类中设置通用的属性(weight、height、eat(); run(); … …),让原有的类继承该类,这样子类中就可以不再重复写这些方法了,同样子类下的子类依然可以通过继承父类来避免代码的重复。示例图如下:

但是当顶级父类(animal)中的多个方法中的相同位置出现重复代码时,如下图,OOP的思想就无法解决了。此时我们就需要用到AOP的思想了。

 首先解释此类重发代码被称为“横切逻辑代码”,即在多个纵向(顺序)流程中出现的多个相同子流程代码。
此类代码的使用场景通常有:事务控制、权限校验和打印日志中。

横切逻辑代码存在什么问题:
   1、横切代码重复问题;
   2、横切逻辑代码和业务代码混杂在⼀起,代码臃肿,维护不⽅便。

AOP提出了横向抽取机制,将横切逻辑代码和业务逻辑代码分离,在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复。

AOP的相关注解有哪些?

@Aspect:声明被注解的类是一个切面的Bean;
@Before:前置通知,指在某个连接点之前执行的通知;
@After:后置通知,指某个连接点退出时执行的通知(不论程序是正常返回还是异常退出)
@AfterReturning:返回后通知,指某连接点正常完成之后执行的通知,返回值使用returning属性接收。
@AfterThrowing:异常通知,指方法抛出异常导致退出时执行的通知,和@AfterReturning只会有一个执行,异常使用throwing属性接收。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值