由浅入深理解Spring的IOC机制和AOP机制

本文详细介绍了Spring的核心原理,包括IOC控制反转和DI依赖注入,展示了如何配置Spring容器、编写接口及实现类,并通过AOP实现面向切面编程。阅读本文,掌握Spring框架在降低耦合和代码复用中的关键作用。

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

目录

1 Spring是什么

2 Spring发展史

3 Spring的两大核心

4 Spring的优势

5 Spring IOC没有使用之前的问题

6 Spring IOC系统的类与类之间彻底的解耦合

7 Spring IOC框架,控制反转,依赖注入实例

7.1 什么是IOC

7.2 什么是DI

7.3 Spring的生命周期

8 配置Spring框架

8.1 编写UserDao接口和实现类

8.2 创建Spring配置文件

8.3 在配置文件中配置bean标签,将对象的创建交给Spring容器

8.4 使用Spring的API从容器中获取Bean实例

9 Spring的AOP机制


1 Spring是什么

互联网行业,传统软件行业,技术栈里面一般来说都是以spring框架为核心的,一定是用一大堆的框架,上来哐哐哐,整合一下框架,然后完全就是基于框架来做一些crud,增删改查的业务功能的实现

Spring是一个轻量级的全栈式框架

轻量级指的是配置方便、占用资源小

全栈式指的是针对controller(springmvc),service(spring),dao(jdbctemplate)有不同的解决方案

2 Spring发展史

作者:Rod Johnson(Spring之父)

当前最新版:2017年9月发布了Spring 5.0最新通用版。

3 Spring的两大核心

IOC:全称Inverse of Control,控制反转的意思,表示把对象的创建交给框架

AOP:全称Aspect Oriented Programming,面向切面编程的意思,是对动态代理的再次封装

4 Spring的优势

1.可以借助IOC降低程序之间的耦合

2.可以借助AOP来实现方法的动态增强

3.支持声明式事物

4.方便集成其他框架,比如struts,hibernate,mybatis等

5 Spring IOC没有使用之前的问题

写一套系统,web服务器,tomcat,一旦启动之后,他就可以监听一个端口号的http请求,然后可以把请求转交给你的servlet,jsp,配合起来使用的,servlet处理请求

比如在我们的一个tomcat+servlet的这样的一个很low的系统里,有几十个地方,都是直接用MyService myService = new MyServiceImpl(),直接创建、引用和依赖了一个MyServiceImpl这样的一个类的对象。

我们这个low系统里,有几十个地方,都跟MyServiceImpl类直接耦合在一起了

我现在不想要用MyServiceImpl了,我们希望用的是NewServiceManagerImpl,implements MyService这个接口的,所有的实现逻辑都不同了,此时我们很麻烦,我们需要在很low的系统里,几十个地方,都去修改对应的MyServiceImpl这个类,切换为NewServiceManagerImpl这个类

改动代码成本很大,改动完以后的测试的成本很大,改动的过程中可能很复杂,出现一些bug,此时就会很痛苦,归根结底,代码里,各种类之间完全耦合在一起,出现任何一丁点的变动,都需要改动大量的代码,重新测试,可能还会有bug

优化tomcat在启动的时候,直接会启动spring容器

spring ioc,spring容器,根据xml配置,或者是你的注解,去实例化你的一些bean对象,然后根据xml配置或者注解,去对bean对象之间的引用关系,去进行依赖注入.

某个bean依赖了另外一个bean,也就是换了一个Impl,现在这套比较高大上的一点系统里,有几十个类都使用了@Resource这个注解去标注MyService myService,几十个地方都依赖了这个类,之后如果要修改实现类为NewServiceManagerImpl就可以更换所有的实现.

底层的核心技术,反射,他会通过反射的技术,直接根据你的类去自己构建对应的对象出来,用的就是反射技术

6 Spring IOC系统的类与类之间彻底的解耦合

7 Spring IOC框架,控制反转,依赖注入实例

7.1 什么是IOC

IOC是控制反转,就是将对象的创建交由框架管理

7.2 什么是DI

DI是依赖注入,就是通过框架给成员变量赋值,框架中称为注入值。注入方式有两种SET注入和构造器注入,开发中一般使用SET注入。

7.3 Spring的生命周期

1.实例化(比如Person p = new Person())

2.设置对象属性(比如p.setName(“jack”))

3.初始化 (执行bean标签中init-method属性指定的方法)

4.销毁(执行bean标签中destroy-method属性指定的方法)

8 配置Spring框架

xml文件来进行一个配置,进化到了基于注解来进行自动依赖注入

我们只要在这个工程里通过maven引入一些spring框架的依赖,ioc功能

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>
</dependencies>

8.1 编写UserDao接口和实现类

编写UserDao接口

public interface UserDao {
    void save();
}

编写UserDaoImpl实现类

public class UserDaoImpl implements UserDao {
    public void save() {
        System.out.println("UserDao save method running...");
    }
}

8.2 创建Spring配置文件

根据下图步骤创建配置文件,配置文件名字最好叫applicationContext.xml

配置文件内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

</beans>

8.3 在配置文件中配置bean标签,将对象的创建交给Spring容器

在applicationContext.xml中添加

该标签的作用表示创建一个UserDaoImpl对象,对象名叫userDao

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <bean id="userDao" class="cn.itcast.dao.impl.UserDaoImpl"></bean>

</beans>

8.4 使用Spring的API从容器中获取Bean实例

public class UserDaoImplTest {
    @Test
    public void save() {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao)context.getBean("userDao");
        userDao.save();
    }
}

9 Spring的AOP机制

spring核心框架里面,最关键的两个机制,就是ioc和aop,根据xml配置或者注解,去实例化我们所有的bean,管理bean之间的依赖注入,让类与类之间解耦,维护代码的时候可以更加的轻松便利

spring已经管理了我们代码里所有的这个类的对象实例,bean

类的对象实例

我们有几十个Service组件,类似的一样的代码,重复的代码,必须在几十个地方都去写一模一样的东西

spring aop机制出马了  进行将相同功能又需要反复在不同类编写的代码抽离出来,进行切入

他有几个概念,可以做一个切面,语法、用法、术语和概念,完整、详细的了解,上网再去搜一些资料

做一个切面,如何定义呢?MyServiceXXXX的这种类,在这些类的所有方法中,都去织入一些代码,在所有这些方法刚开始运行的时候,都先去开启一个事务,在所有这些方法运行完毕之后,去根据是否抛出异常来判断一下,如果抛出异常,就回滚事务,如果没有异常,就提交事务 => AOP

面向切面编程,Aspect

建议大家看完这个视频,自己百度一下,spring aop代码示例,基于spring aop,切面如何来做,如何来定义增强的代码,如何来限定对哪些类的哪些方法进行增强

spring在运行的时候,动态代理技术,AOP的核心技术,就是动态代理

他会给你的那些类生成动态代理

动态代理

事务,mysql,数据库里都提供一个事务机制,我们如果开启一个事务,在这个事务里执行多条增删改的sql语句,这个过程中,如果任何一个sql语句失败了,会导致这个事务的回滚,把其他sql做的数据更改都恢复回去

在一个事务里的所有sql,要么一起成功,要么一起失败,事务功能可以保证我们的数据的一致性,在业务逻辑组件里去加入这个事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵广陆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值