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,要么一起成功,要么一起失败,事务功能可以保证我们的数据的一致性,在业务逻辑组件里去加入这个事务