老生常谈IOC与AOP

2023-12-17 13:18
文章标签 ioc aop 老生常谈

本文主要是介绍老生常谈IOC与AOP,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

IOC与AOP基本原理

IoC(Inversion of Control)就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。IoC还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象地说,即由容器动态地将某种依赖关系注入到组件之中。

 

IoC是近年来兴起的一种思想,不仅仅是编程思想。主要是协调各组件间相互的依赖关系,同时大大提高了组件的可移植性,组件的重用机会也变得更多。在传统的实现中,由程序内部代码来控制程序之间的关系。我们经常使用new关键字来实现两组键间关系的组合,这种实现的方式会造成组件之间耦合(一个好的设计,不但要实现代码重用,还要将组件间关系解耦)。IoC很好的解决了该问题,它将实现组件间关系从程序内部提到外部容器来管理。也就是说由容器在运行期将组件间的某种依赖关系动态的注入组件中。控制程序间关系的实现交给了外部的容器来完成。

 

IoC的实现形式有两种:

     依赖查找:容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都是使用这种方式。     

     依赖注入:组件不做定位查询,只是提供普通的Java方法让容器去决定依赖关系。容器全权负责组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造子传递给需要的对象。

          通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);

          将依赖关系作为构造子参数传入的做法称为构造子注入(Constructor Injection)。

 

Spring注解实现IOC

@Resource
@Resource有两个常用属性name、type,所以分4种情况

指定name和type:通过name找到唯一的bean,找不到抛出异常;如果type和字段类型不一致,也会抛出异常
指定name:通过name找到唯一的bean,找不到抛出异常
指定type:通过tpye找到唯一的bean,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
都不指定:通过字段名作为key去查找,找到则赋值;找不到则再通过字段类型去查找,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
@Autowired
@Autowired只有一个属性required,默认值为true,为true时,找不到就抛异常,为false时,找不到就赋值为null

@Autowired按类型查找,如果该类型的bean不唯一,则抛出异常;可通过组合注解解决@Autowired()@Qualifier("baseDao")

相同点
Spring都支持
都可以作用在字段和setter方法上
不同点
Resource是JDK提供的,而Autowired是Spring提供的
Resource不允许找不到bean的情况,而Autowired允许(@Autowired(required = false))
指定name的方式不一样,@Resource(name = "baseDao"),@Autowired()@Qualifier("baseDao")
Resource默认通过name查找,而Autowired默认通过type查找
 

AOP为Aspect Oriented Programming的缩写,意为:面向方面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

 

AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。

 

1、AOP相关概念:

      1)方面(Aspect):一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的Advisor或拦截器实现。

      2)切入点(Pointcut):指定一个通知将被引发的一系列连接点的集合。

      3)连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。

      4)通知(Advice):在特定的连接点,AOP框架执行的动作。

      5)目标对象(Target Object):包含连接点的对象,也被称作被通知或被代理对象。

      6)AOP代理(AOP Proxy):AOP框架创建的对象,包含通知。在Spring中,AOP代理可以是JDK动态代理或CGLIB代理。

      7)引入(Introduction):添加方法或字段到被通知的类。Spring允许引入新的接口到任何被通知的对象。

      8)编织(Weaving):组装方面来创建一个被通知对象。

 

2、Java领域的AOP实现有多种方案,主要包括:

      1)AspectJ (TM):创建于Xerox PARC. 有近十年历史,技术成熟。但其过于复杂;破坏封装;而且需要专门的Java编译器,易用性较差。

      2)动态代理AOP:使用JDK提供的动态代理API或字节码Bytecode处理技术来实现。基于动态代理API的具体项目有: JBoss 4.0 JBoss 4.0服务器。

      3)基于字节码的AOP,例如:Aspectwerkz, CGlib, Spring等。

这篇关于老生常谈IOC与AOP的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/504506

相关文章

SSM项目使用AOP技术进行日志记录

本步骤只记录完成切面所需的必要代码 本人开发中遇到的问题: 切面一直切不进去,最后发现需要在springMVC的核心配置文件中中开启注解驱动才可以,只在spring的核心配置文件中开启是不会在web项目中生效的。 之后按照下面的代码进行配置,然后前端在访问controller层中的路径时即可观察到日志已经被正常记录到数据库,代码中有部分注释,看不懂的可以参照注释。接下来进入正题 1、导入m

SpringBoot中利用EasyExcel+aop实现一个通用Excel导出功能

一、结果展示 主要功能:可以根据前端传递的参数,导出指定列、指定行 1.1 案例一 前端页面 传递参数 {"excelName": "导出用户信息1725738666946","sheetName": "导出用户信息","fieldList": [{"fieldName": "userId","fieldDesc": "用户id"},{"fieldName": "age","fieldDe

Spring6详细学习笔记(IOC+AOP)

一、Spring系统架构介绍 1.1、定义 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。Spring官网 Spring是一款主流的Java EE 轻量级开源框架,目的是用于简化Java企业级引用的开发难度和开发周期。从简单性、可测试性和松耦合度的角度而言,任何Java应用都可以从Spring中受益。Spring框架提供自己提供功能外,还提供整合其他技术和框架

spring ioc容器的原理

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协

AOP之执行前通知@Before

Spring AOP之执行前通知@Before 此文章说一下执行前通知,即注解@Before。 作用 多用于日志记录、权限校验、初始化资源等。 触发时间 目标函数执行触发。 定义 public class AopBeforeAspect {@Before("execution(public * com.example.demo.service.impl.AccountServiceI

Spring之AOP面向切面编程实现(一)

实现方式:基于配置XML和基于注解实现。 场景:一个手机进货系统,一旦要进货(或出货),要提前记录进货时间,进货完毕后,还要提醒其它人进行验货。 分析:3步走,1,操作进货(或出货)的方法的时候,先记录当前的时间,完毕后,提醒其他人验货。为了不使代码变得冗余,采用aop的策略实现。 基于配置实现 进货出货的接口: IPhoneService.java public i

SpringIOC源码分析(六)__IOC容器的初始化__BeanDefinition载入注册

一、前情提要 上一篇提到了IOC容器初始化的流程,及资源定位,本篇主要分析BeanDefinition的载入过程 二、BeanDefiniton载入解析 BeanDefinition是IOC容器对Bean的数据承载模型,IOC容器对Bean的管理和依赖注入的实现,是通过对BeanDefinition的各种操作来实现的,IOC容器通过一个HashMap来保持和维护这些BeanDefinit

SpringIOC源码分析(五)__IOC容器的初始化__资源加载

一、IOC容器初始化过程 IOC容器初始化是由如上篇所讲到的refresh(),方法来启动的,启动包括BeanDefinition的Resource定位,载入和注册这个主要过程。 过程一:resource定位,是由resourceLoader通过getResource(String location) 的接口来完成的。过程二:将用户定义的Bean表示为IOC容器的内部数据结构BeanDef

Spring-容器:IOC-基于XML管理Bean

目录 一、概述1.1、定义1.2、简介1.3、作用1.4依赖注入1.4.1定义1.4.2作用1.4.3实现方式1.5实现 二、基于XML管理Bean(了解)2.1、获取Bean的方式2.2、依赖注入2.2.1、根据setter注入2.2.2、根据构造器注入 2.3、特殊值处理2.3.1、字面量赋值2.3.2、null值2.3.3、xml实体2.3.4、CDATA节 2.4、为对象类型属性赋

关于spring 类内部方法调用aop不生效原因,以及jdk,cglib 动态代理原理

目录 引入:spring的aop 深入实验(发现类内部方法调用的代理可以生效) 自己实现动态代理(cglib) spring的动态代理实现 自己实现spring aop的效果 关于上述自己实现aop与spring aop的区别 自己实现的aop:  spring 实现的aop: 模仿spring aop的效果, 代码示例: spring 什么时候为类创建代理 spring b