IoC与AOP的那点事儿

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: IoC与AOP的那点事儿

IoC


控制反转(Inversion of Control)是OOP中的一种设计原则,也是Spring框架的核心.大多数应用程序的业务逻辑代码都需要两个或多个类进行合作完成的,通过IoC则可以减少它们之间的耦合度.

实现方法


IoC的主要实现方法有两种,依赖注入依赖查找.

依赖注入 : 应用程序被动的接收对象,IoC容器通过类型或名称等信息来判断将不同的对象注入到不同的属性中.

依赖注入主要有以下的方式:

  • 基于set方法 : 实现特定属性的public set()方法,来让IoC容器调用注入所依赖类型的对象.
  • 基于接口 : 实现特定接口以供IoC容器注入所依赖类型的对象.
  • 基于构造函数 : 实现特定参数的构造函数,在创建对象时来让IoC容器注入所依赖类型的对象.
  • 基于注解 : 通过Java的注解机制来让IoC容器注入所依赖类型的对象,例如Spring框架中的@Autowired.

依赖查找 : 它相对于依赖注入而言是一种更为主动的方法,它会在需要的时候通过调用框架提供的方法来获取对象,获取时需要提供相关的配置文件路径、key等信息来确定获取对象的状态.

IoC的思想


在传统实现中,我们都是通过应用程序自己来管理依赖的创建,例如下代码.

public class Person {
  // 由Person自己管理Food类的创建
  public void eat() {
    Food food = new Chicken();
    System.out.println("I am eating " + food.getName() + "...");
  }
}

IoC则是通过一个第三方容器来管理并维护这些被依赖对象,应用程序只需要接收并使用IoC容器注入的对象而不需要关注其他事情.

public class Person {
  private Food food;
  // 通过set注入
  public void setFood(Food food) {
    this.food = food;
  }
  // Person不需要关注Food,只管使用即可
  public void eat() {
    System.out.println("I am eating " + this.food.getName() + "...");
  }
}

通过以上的例子我们能够发现,控制反转其实就是对象控制权的转移,应用程序将对象的控制权转移给了第三方容器并通过它来管理这些被依赖对象,完成了应用程序与被依赖对象的解耦.

AOP


AOP(Aspect-Oriented Programming)即面向方面编程.它是一种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想.用于切入到指定类指定方法的代码片段叫做切面,而切入到哪些类中的哪些方法叫做切入点.

AOPOOP的有益补充,OOP从横向上区分出了一个个类,AOP则从纵向上向指定类的指定方法中动态地切入代码.它使OOP变得更加立体.

Java中的动态代理或CGLib就是AOP的体现.

案例分析


OOP中,我们使用封装的特性来将不同职责的代码抽象到不同的类中.但是在分散代码的同时,也增加了代码的重复性.

例如,我们需要在两个或多个类中的方法都记录日志或执行时间,可能这些代码是完全一致的,但因为类与类无法联系造成代码重复.

public class A {
  public void something () {
    // 业务逻辑...
    recordLog();  
  }
  private void recordLog() {
    // 记录日志...
  }
}
public class B {
  public void something () {
    // 业务逻辑...
    recordLog();
  }
  private void recordLog() {
    // 记录日志...
  }
}

接下来,我们采取两种不同方案来改进这段代码.

将重复代码抽离到一个类中

public class A {
  public void something () {
    // 业务逻辑...
    Report.recordLog();
  }
}
public class B {
  public void something () {
    // 业务逻辑...
    Report.recordLog();
  }
}
public class Report {
  public static void recordLog (String ...messages) {
    // 记录日志...
  }
}

这样看似解决了问题,但类之间已经耦合了.并且当这些外围业务代码(日志,权限校验等)越来越多时,它们的侵入(与核心业务代码混在一起)会使代码的整洁度变得混乱不堪.

使用AOP分离外围业务代码


我们使用AspectJ,它是一个AOP框架,扩展了Java语言,并定义了AOP语法(通过它实现的编译器).

使用AspectJ需要先安装并将lib中aspectjrt.jar添加进入classpath,下载地址.

public class Something {
    public void say() {
        System.out.println("Say something...");
    }
    public static void main(String[] args) {
        Something something = new Something();
        something.say();
    }
}
public aspect SomethingAspect {
    /**
     * 切入点,切入到Something.say()
     */
    pointcut recordLog():call(* com.sun.sylvanas.application.hello_aop.Something.say(..));
    /**
     * 在方法执行后执行
     */
    after():recordLog() {
        System.out.println("[AFTER] Record log...");
    }
}

AOP解决了代码的重复并将这些外围业务代码抽离到一个切面中,我们可以动态地将切面切入到切入点.


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
3天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
7 0
|
1月前
|
Java Spring 容器
Spring IOC、AOP与事务管理底层原理及源码解析
【10月更文挑战第1天】Spring框架以其强大的控制反转(IOC)和面向切面编程(AOP)功能,成为Java企业级开发中的首选框架。本文将深入探讨Spring IOC和AOP的底层原理,并通过源码解析来揭示其实现机制。同时,我们还将探讨Spring事务管理的核心原理,并给出相应的源码示例。
118 9
|
1月前
|
XML Java 数据格式
Spring的IOC和AOP
Spring的IOC和AOP
44 0
|
3月前
|
安全 Java 开发者
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
Java 新手入门:Spring 两大利器IoC 和 AOP,小白也能轻松理解!
43 1
|
4月前
|
容器
springboot-自定义注解拦截ip aop和ioc
springboot-自定义注解拦截ip aop和ioc
|
5月前
|
XML Java 开发者
“掌握Spring IoC和AOP:30道面试必备问题解析!“
“掌握Spring IoC和AOP:30道面试必备问题解析!“
112 0
|
6月前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
78 0
|
6月前
|
Java 测试技术 开发者
探究 Spring Boot 的核心:IOC 和 AOP
Spring Boot 作为一种简化 Spring 应用开发的工具,继承了 Spring 框架的核心概念,其中最重要的是控制反转(IOC)和面向切面编程(AOP)。它们是 Spring 框架的基础,同时也深深植根于 Spring Boot 中。本文将讨论 IOC 和 AOP 的概念以及它们在 Spring Boot 中的应用。
228 4
|
6月前
|
安全 Java 数据库连接
Spring框架:IoC容器、AOP、事务管理等知识讲解梳理
Spring框架:IoC容器、AOP、事务管理等知识讲解梳理
96 1
|
6月前
|
设计模式 Java 程序员
深入理解spring的两大特性 ioc 和aop
深入理解spring的两大特性 ioc 和aop
126 0