Spring IOC与AOP源码分析,吊锤面试官 SO easy!

本文详细介绍了Spring框架的核心思想,包括IoC(控制反转)和AOP(面向切面编程)。从手动实现到实际应用,再到源码剖析,帮助读者深入理解Spring的IoC容器和AOP机制。文中还涵盖了Spring的Bean生命周期、事务管理、源码分析等内容,旨在提升读者对Spring框架的掌握。
摘要由CSDN通过智能技术生成

本文对Spring相关知识点做了归纳整理,包括 Spring 优势、其框架结构、核心思想,并对IoC思想及AOP思想进行手动实现,增强对Spring 核心思想的理解。之后对Spring IoC、AOP 的实现方式和特性进行介绍,并对照源码理解其实现思路。

Spring 优势

  • 方便解耦,简化开发

    「[注:IoC(降低组件耦合性)、DI(降低业务对象替换的复杂性)]」

  • AOP编程的思想

    「[注:通用任务集中管理,使得代码可更好的复用]」

  • 声明式事务的支持

    「[注:@Transaction]」

  • 轻量级框架,代码侵入性低,可自由选择框架部分组件

  • 方便集成各种优秀框架

Spring 核心结构

img

  • Spring核心容器(Core Container):容器是Spring框架最核心的部分,管理Bean的创建(IoC)、配置(DI)和管理(Context),所有的Spring模块都构建于核心容器之上.

  • 面向切面编程(AOP):Spring应用系统中开发切面的基础,代码解耦,增强复用。

  • 数据访问与集成(Data Access):Spring的JDBC和DAO模块封装大量样板代码,使得数据库代码变得简洁,也可避免数据库资源释放失败引发的问题。由JDBC、Transactions(AOP模块支持)、ORM、OXM 和 JMS等模块组成。

  • Web:提供了SpringMVC框架给Web应⽤,还提供了多种构建和其它应⽤交互的远程调⽤⽅ 案。SpringMVC框架在Web层提升了应⽤的松耦合⽔平。

  • Test 为了使得开发者能够很⽅便的进⾏测试,Spring提供了测试模块以致⼒于Spring应⽤的测试。通过该模块,Spring为使⽤Servlet、JNDI等编写单元测试提供了⼀系列的mock对象实现。

核心思想

IoC(Inversion of Control)控制反转

IoC 是一个技术思想,而Spring对其进行了实现

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

解决问题:解决对象间的耦合问题

img

IoC 和 DI 的区别

DI(Dependancy Injection)依赖注⼊

IoC和DI描述的是同一件事情(对象实例化及依赖关系维护),只不过角度不一样罢了

IoC:站在对象的角度,对象实例化及其管理交给容器

DI:站在容器角度,容器会把对象依赖的其他对象注入

AOP(Aspect oriented Programming)面向切面编程

OOP与AOP

OOP是一种垂直继承体系(三大特征:封装、继承和多态)

「AOP为解决纵向重复问题,抽取横向逻辑代码,分离业务逻辑和横切逻辑,解耦合」

AOP解决问题

「解决纵向重复问题,抽取横向逻辑代码,分离业务逻辑和横切逻辑,解耦合」

IoC和AOP的手动实现

IoC与DI实现

  1. 定义beans.xml,其中定义:

    • 需要创建的对象的id和全限定类名 ⇒ 反射创建对象,id为标识

    • 属性名及依赖对象id ⇒ 通过对应类中的 Set方法 注入依赖属性

  2. 定义BeanFactory,读取解析xml,通过反射实例化对象,统一管理,并提供外部获取对象的接口方法

AOP 事务管理

  1. 将 Connection 与当前线程绑定,手动控制 JDBC 的 Connection 事务(关闭自动提交事务)

  2. 创建代理工厂类,对代理类进行事务增强

  3. 使用代理类对象替代对象进行方法的调用

Spring IoC 应用

IoC 实现方式及其对应启动方法

  1. 纯 xml 实现(bean 信息定义全部配置在 xml 中)

    // JavaSE 应用启动
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
    // 或者读取绝对路径下的配置文件(不推荐)
    ApplicationContext applicationContext = new FileSystemXmlApplicationContext("c:/beans.xml");
    
    // JavaWeb 应用
    /**
     配置 ContextLoaderListener 类(web.xml)
     监听器机制加载 xml
    */
    
    <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
        <!--配置Spring ioc容器的配置⽂件-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
        <!--使⽤监听器启动Spring的IOC容器-->
        <listener>
            <listenerclass>org.springframework.web.context.ContextLoaderListener</listenerclass>
        </listener>
    </web-app>
    
  2. xml + 注解(部分 bean 使用 xml 定义,部分 bean 使用注解定义)

    和纯 xml 实现一致

  3. 纯注解 (所有 bean 都是用注解来定义)

    // JavaSE 应用启动
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(Spring.class);
    
    // JavaWeb 应用
    /**
     配置 ContextLoaderListener 类(web.xml)
     监听器机制加载 注解配置类
    */
    
    <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
    <web-app>
        <display-name>Archetype Created Web Application</display-name>
        <!--告诉ContextloaderListener知道我们使⽤注解的⽅式启动ioc容器-->
        <context-param>
            <param-name>contextClass</param-name>
            <paramvalue>org.springframework.web.context.support.AnnotationConfigWebAppli cationContext</param-value>
        </context-param>
        <!--配置启动类的全限定类名-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.lagou.edu.SpringConfig</param-value>
        </context-param>
        <!--使⽤监听器启动Spring的IOC容器-->
        <listener>
            <listenerclass>org.springframework.web.context.ContextLoaderListener</listenerclass>
        </listener>
    </web-app>
    

BeanFactory 与  ApplicationContext  区别

BeanFactory是Spring框架中IoC容器的顶层接⼝,它只是⽤来定义⼀些基础功能,定义⼀些基础规范,⽽ApplicationContext是它的⼀个⼦接⼝,所以ApplicationContext是具备BeanFactory提供的全部功能的。

ApplicationContext是容器的⾼级接⼝,⽐ BeanFactory要拥有更多的功能,⽐如说国际化⽀持和资源访问(xml,java配置类)等等

实例化Bean的三种方式

  1. 使用无参构造器

    <!--配置service对象-->
    <bean id="userService" class="com.lagou.service.impl.TransferServiceImpl">
    </bean>
    
  2. 使用静态方法创建

    <!--使⽤静态⽅法创建对象的配置⽅式-->
    <bean id="userService" class="com.lagou.factory.BeanFactory" factory-method="getTransferService"></bean>
    
    
  3. 使用实例化方法创建

    <!--使⽤实例⽅法创建对象的配置⽅式-->
    <bean id="beanFactory" class="com.lagou.factory.instancemethod.BeanFactory"></bean>
    <bean id="transferService" factory-bean="beanFactory" factory-method="getTransferService"></bean>
    

Bean 的作用范围及

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值