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

简介: 由浅入深理解Spring的IOC机制和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容器


20201031161900599.png


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


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


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


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

20201031162048222.png


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


52d5f0eb1a48c241f26a64da899791e8.png


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


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


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


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


面向切面编程,Aspect


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


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


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


a8f5767d66ff7e6042981592c6812cc7.png


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


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


目录
相关文章
|
5天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
14 0
|
3天前
|
缓存 NoSQL Java
17:缓存机制-Java Spring
17:缓存机制-Java Spring
15 5
|
4天前
|
Java 开发者 Spring
Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
【5月更文挑战第1天】Spring AOP的切点是通过使用AspectJ的切点表达式语言来定义的。
14 5
|
4天前
|
XML Java 数据格式
Spring AOP
【5月更文挑战第1天】Spring AOP
20 5
|
4天前
|
Java 编译器 开发者
Spring的AOP理解
Spring的AOP理解
|
4天前
|
XML Java 数据格式
如何在Spring AOP中定义和应用通知?
【4月更文挑战第30天】如何在Spring AOP中定义和应用通知?
11 0
|
4天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
16 0
|
5天前
|
XML Java 程序员
什么是Spring的IoC容器?
【4月更文挑战第30天】什么是Spring的IoC容器?
12 0
|
5月前
|
XML Java 数据格式
④【Spring】IOC - 基于注解方式 管理bean
④【Spring】IOC - 基于注解方式 管理bean
49 0
|
5月前
|
XML Java 数据格式
②【Spring】一文精通:IOC - 基于XML方式管理Bean
②【Spring】一文精通:IOC - 基于XML方式管理Bean
146 0