Spring中IOC DI和AOP分别是什么

1,166 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情

前言

什么是Spring boot, 为什么Spring boot在java领域这么流行

一说到这个问题, 那肯定要先从Spring讲起, 毕竟Spring boot实际上可以看做是Spring的扩展版, 在我的理解里, 用java的方式讲解Spring和Spring boot的话就是继承和被继承的关系

那么说到Spring, Spring的几个核心概念: 轻量级, AOP, IOC, DI又是不可忽视的, 本章就从Spring的几个核心概念为大家揭开Springboot的神秘面纱

Spring的核心概念

IOC(控制反转)

定义: IOC是一种设计思想, 被称为控制反转, 在Java开发中, 就是将原本手动创建对象的权利交由Spring框架进行管理

控制反转实际上就是当你想要创建对象的时候不自己去创建, 而是向Spring IOC容器发起请求, 告诉他我要创建哪个哪个对象了, 然后Spring IOC容器就会返回一个对象实例给你, 这就是IOC控制反转, 将创建对象的权利交由Spring IOC容器管理

优点:

  • 可以极大地简化应用的开发, 降低藕合
  • 对象由Spring IOC容器进行管理, 我们只需要配置好配置文件或注解就可以, 不用去关注对象的创建过程
  • 资源易管理

DI(依赖注入)

定义: 依赖注入是IOC控制反转的具体实现, 是实现用于解决依赖性设计模式

因为对象资源的获取全部要依赖于Spring IOC容器, 组件之间的依赖关系由容器在应用系统运行期来决定, 在需要的时候由Spring IOC容器动态地往组件中注入需要的实例对象,就叫依赖注入

AOP(面向切面)

定义: 面向切面编程, AOP是OOP(面向对象编程)的一种延续

AOP主要解决:

  • 在不改变原有业务逻辑的情况下, 增强横切逻辑代码
  • 根本上解耦合
  • 避免和企鹅逻辑代码重复

常见应用范围:

  • 处理日志
  • 安全管理
  • 事务管理

AOP的通知(advice):

  • 前置通知(Before): 在方法被调用之前执行
  • 后置通知(After): 目标方法完成之后调用通知
  • 返回通知(After-returning): 在目标方法完成之后调出通知, 不管成功还是失败
  • 异常通知(After-throwing): 在目标方法抛出异常之后通知
  • 环绕通知(Around): 通知环绕在方法前后, 自定义通知执行在方法前后的内容

和aop相似的拦截器, 过滤器, 三者的区别

过滤器, 拦截器拦截的是URL, AOP拦截的是类的元数据(包, 类, 方法名, 参数等)

三者的功能类似, 但是各有各的优势, 过滤器 -- > 拦截器 --> aop 拦截规则越来越细致, 执行的顺序依次是 过滤器 --> 拦截器 --> aop

around的demo

package com.ningxuan.demo.conifg;
​
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
​
import java.util.Arrays;
​
/**
 * aop测试
 */@Aspect
@Component
public class AopConfig {
​
    /**
     * 环绕通知
     * 在com.yl.spring.aop.ArithmeticCalculator接口的每一个方法执行前后都执行一段代码
     * @param pjd   环绕通知必须有返回值, 返回值为目标方法的返回值
     */
    @Around("execution(public int com.ningxuan.demo.controller.TestController.*(..))")
    public Object roundTest(ProceedingJoinPoint pjd) {
        Object result = null;
        String methodName = pjd.getSignature().getName();
        //执行目标方法
        try {
            //前置通知
            System.out.println("The method " + methodName + " begins with " + Arrays.asList(pjd.getArgs()));
            result = pjd.proceed();
            //返回通知
            System.out.println("The method " + methodName + " ends with " + Arrays.asList(pjd.getArgs()));
        } catch (Throwable e) {
            //异常通知
            System.out.println("The method " + methodName + " occurs expection : " + e);
            throw new RuntimeException(e);
        }
        //后置通知
        System.out.println("The method " + methodName + " ends");
        return result;
    }
​
}

总结

  • Spring通过IOC, AOP来简化java开发
  • Spring的IOC降低了组件间的耦合性
  • AOP天生适合做日志/事务等集中式处理, 提高了代码的复用性
  • Spring的生态及其完整, 是国内名副其实的大哥大