Spring的IOC

博客围绕系统设计展开,先将大系统按业务功能分解成低耦合、高内聚模块,抽取日志、安全等通用部分。指出调用通用模块时公共代码掩盖业务逻辑的问题,介绍模板方法和装饰者模式及其缺陷,重点阐述Spring的AOP,包括概念、切入点、通知,还提及解决隔离问题的三种方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.系统设计:
    我们在做系统设计的时候,一个非常重要的工作就是把一个大系统做分解,按业务功能分解成一个个低耦合,高内聚的模块.
    
    分解之后,会发现有一些东西是通用的:
    日志: 对特定的操作输出日志来记录
    安全: 在执行操作之前进行操作检查
    性能: 要统计每个方法的执行时间
    事务: 方法开始之前要开始事务,结束后要提交或回滚事务
    
2.抽取公共部分:
    最简单的办法就是把这些通用模块的接口写好, 让程序员在实现业务模块的时候去调用
    
3.问题:
    调用时,会有很多的公共代码,而这些代码要把我们真正的业务逻辑代码掩盖了,降低代码的维护性
    
4.设计模式: 模板方法
    父类(BaseCommand)中已经把那些“乱七八糟“的非功能代码都写好了, 只是留了一个口子(抽象方法doBusiness())让子类去实现。
    设计缺陷: 父类会定义一切,要执行哪些功能代码,以什么顺序执行都是固定了的,子类只能无条件接受
    
5.设计模式: 装饰者模式
    我们的业务类和装饰类(日志/事务)实现同一个业务接口,装饰对象来加强我们的业务对象
    不爽之处: 
        1.处理日志/事务的类为什么要实现业务接口呢?
        2.如果别的业务模块,没有实现这个业务接口,也想使用日志/事务的功能怎么办?    
    
6.Spring的AOP
    大体概念:
        我们在Spring中配置需要切面的业务方法,然后自定义一个切面类(普通的java类),写一个环绕通知方法(里面放日志/事务这种公共的操作),
        在执行业务方法的之前/之后都可以植入公共的代码.
        
    切入点: 根据配置,需要切入的业务方法
    通知: 在方法调用之前/之后,执行xxx
    
    使用AOP的好处: 
        切面类和业务类在源代码的层次上,没有一点关系,完全隔离了

    隔离问题:
        Java是一门静态的强类型语言,代码一旦写好,编译成java class以后,可以在运行时通过反射来查看类的信息,但是想对类修改非常的困难.
        而AOP要求的恰恰就是在不改变业务类的源代码的情况下,修改业务类的方法,进行功能的增强,就像上面说的给所有的类增加事务支持.
        
    解决方法:
        XML配置文件: 1.在编译的时候,根据AOP的配置信息,悄悄把日志,事务等"切面"代码和业务类编译到一起去.
        JDK动态代理: 2.在运行期,业务类加载以后,通过Java动态代理技术为业务类生产一个代理类,把"切面"代码放到代理类中,Java动态代理要求业务类需要实现接口才行.
        CGlib代理:   3.在运行期,业务类加载以后,动态的使用字节码构建一个业务类的子类,将"切面"逻辑放到子类当中去,CGlib就是这么做的

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 “STC单片机电压测量”是一个以STC系列单片机为基础的电压检测应用案例,它涵盖了硬件电路设计、软件编程以及数据处理等核心知识点。STC单片机凭借其低功耗、高性价比和丰富的I/O接口,在电子工程领域得到了广泛应用。 STC是Specialized Technology Corporation的缩写,该公司的单片机基于8051内核,具备内部振荡器、高速运算能力、ISP(在系统编程)和IAP(在应用编程)功能,非常适合用于各种嵌入式控制系统。 在源代码方面,“浅雪”风格的代码通常简洁易懂,非常适合初学者学习。其中,“main.c”文件是程序的入口,包含了电压测量的核心逻辑;“STARTUP.A51”是启动代码,负责初始化单片机的硬件环境;“电压测量_uvopt.bak”和“电压测量_uvproj.bak”可能是Keil编译器的配置文件备份,用于设置编译选项和项目配置。 对于3S锂电池电压测量,3S锂电池由三节锂离子电池串联而成,标称电压为11.1V。测量时需要考虑电池的串联特性,通过分压电路将高电压转换为单片机可接受的范围,并实时监控,防止过充或过放,以确保电池的安全和寿命。 在电压测量电路设计中,“电压测量.lnp”文件可能包含电路布局信息,而“.hex”文件是编译后的机器码,用于烧录到单片机中。电路中通常会使用ADC(模拟数字转换器)将模拟电压信号转换为数字信号供单片机处理。 在软件编程方面,“StringData.h”文件可能包含程序中使用的字符串常量和数据结构定义。处理电压数据时,可能涉及浮点数运算,需要了解STC单片机对浮点数的支持情况,以及如何高效地存储和显示电压值。 用户界面方面,“电压测量.uvgui.kidd”可能是用户界面的配置文件,用于显示测量结果。在嵌入式系统中,用
### Spring IOC 原理及实现 #### 1. 控制反转(IOC)的概念 控制反转(Inversion of Control,简称 IOC)是一种设计思想,旨在将对象的创建和管理从应用程序代码中分离出来。通过 IOC,开发者无需手动管理对象的生命周期和依赖关系,而是由框架负责这些任务。这种思想使得开发者可以专注于业务逻辑的实现,而不需要关心对象之间的交互细节[^1]。 #### 2. 依赖注入(DI) 依赖注入(Dependency Injection,简称 DI)是实现 IOC 的一种方式。DI 的核心在于通过外部配置或注解的方式,将对象的依赖关系注入到目标对象中,而不是由对象自己负责依赖的创建和管理。依赖注入有三种主要形式:构造器注入、Setter 方法注入和字段注入[^4]。 #### 3. Spring IOC 容器的核心接口 Spring 框架提供了两种主要的 IOC 容器接口: - **BeanFactory**:这是 Spring 框架的基础接口,面向 Spring 内部使用。它负责配置、创建和管理 Bean 的生命周期。 - **ApplicationContext**:这是一个更高级的容器接口,面向开发者使用。它扩展了 BeanFactory 的功能,提供了更多的企业级特性,如国际化支持、事件传播等。在实际开发中,通常使用 ApplicationContext 而非 BeanFactory[^2]。 #### 4. Spring IOC 的实现方式 Spring IOC 的实现主要包括以下几个方面: ##### (1) 元数据解析 Spring 使用 XML 文件、Java 注解或 Java 配置类来定义 Bean 的元数据。例如,通过 `<bean>` 标签在 XML 文件中定义 Bean,或者使用 `@Component`、`@Service` 等注解在 Java 类上声明 Bean[^5]。 示例代码(XML 配置): ```xml <bean id="userDao" class="com.mayuanfei.springioc.dao.impl.UserDaoImpl" /> ``` 示例代码(注解配置): ```java @Component public class UserDaoImpl implements UserDao { // 实现方法 } ``` ##### (2) 依赖注入 Spring 通过反射机制解析 Bean 的依赖关系,并将其注入到目标对象中。以下是一个简单的依赖注入示例: 示例代码(字段注入): ```java @Service public class UserService { @Autowired private UserDao userDao; // 自动注入 UserDao } ``` ##### (3) 生命周期管理 Spring 容器会管理 Bean 的整个生命周期,包括初始化、运行时和销毁阶段。开发者可以通过实现特定的接口(如 `InitializingBean` 和 `DisposableBean`)或使用注解(如 `@PostConstruct` 和 `@PreDestroy`)来定制 Bean 的生命周期行为。 示例代码(生命周期管理): ```java @Component public class MyBean { @PostConstruct public void init() { System.out.println("Bean 初始化"); } @PreDestroy public void destroy() { System.out.println("Bean 销毁"); } } ``` ##### (4) 扩展机制 Spring 提供了丰富的扩展点,允许开发者自定义容器的行为。例如,通过实现 `BeanFactoryPostProcessor` 或 `BeanPostProcessor` 接口,可以在 Bean 初始化前后插入自定义逻辑[^4]。 #### 5. Spring IOC 的优势 Spring IOC 的核心优势包括: - **解耦**:对象之间不再直接依赖具体实现,而是通过接口或抽象类进行交互。 - **灵活性**:通过配置文件或注解动态管理 Bean,便于修改和扩展。 - **可维护性**:集中处理对象的创建和依赖关系,降低了代码复杂度。 ### 总结 Spring IOC 是一种通过容器管理对象生命周期和依赖关系的设计模式。其核心原理包括元数据解析、依赖注入、生命周期管理和扩展机制。通过这些机制,Spring 实现了对象控制权的反转,从而提高了系统的解耦性、灵活性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值