Spring学习笔记
Spring概述
Spring简介
Spring是分层的全栈轻量级开源框架,以IoC和AOP为内核,提供了展现层Spring MVC和业务层事务管理等众多企业级应用技术,还能整合众多优秀的第三方开源框架和类库,已经成为使用最多的JavaEE企业级应用开源框架
Spring的优势
-
方便解耦,简化开发
通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进行控制,避免硬编码所造成的过度依赖程序耦合,用户也不必为单列模式类、属性文件解析等这些底层的需求编写代码,可以更专注于上层的应用
-
AOP编程
方便面向切面编程,许多不容易用传统OOP实现的功能可以通过AOP轻松实现
-
声明式事务
@Transactional可以将我们从单调的事务管理代码中解脱出来,通过声明式事务方式,灵活的进行事务管理,提供开发的效率和质量
-
方便程序测试
可以用非容器的方式进行几乎所有的测试工作,测试不在是昂贵的操作,而是随手可做的事情
-
方便集成各种优秀的框架
Spring可以降低各种框架的使用难度,提供了各种优秀框架的直接支持
-
降低JAVAEE API的使用难度
Spring对javaEE API进行了封装,使这些API的使用难度大大降低
-
源码是经典的Java学习范例
Spring核心思想
Ioc和AOP不是Spring提出来的,只不过Spring对其进行了很好的实现
IoC
什么是IoC
控制反转:他是一个技术思想,不是一个技术实现
描述的事情:Java开发领域里,对象的创建管理问题
- 传统开发方式:比如类A依赖类B,往往会在类A中new一个对象
- IoC思想下开发:
- 我们不需要new对象,二十通过IoC容器(Spring框架)去帮助我们实例话对象并管理它,我们需要那个对象,直接从IoC容器中拿即可;
- 缺点:我们丧失了创建和管理对象的权力
- 优点:我们不需要考虑对象的创建和管理等问题
为什么叫控制反转?
- 控制
- 指对象的创建的权利
- 反转:
- 控制权交给外部环境(IoC容器、Spring 框架)
IoC解决了什么问题?
IoC解决了对象的耦合问题
IoC和DI的区别
DI:依赖注入
-
IoC和DI描述的是同一件事情,只不过角度不同
-
描述的是对象创建和管理问题(对象实例化及依赖关系维护)
-
IOC:站在对象的角度,对象实例化及管理的权力交给了容器
-
DI是站在容器的角度:容器会把对象依赖的其他对象注入到该对象中,比如A对象在创建过程中,依赖了B对象,则容器需要把B对象注入到A对象中
AOP
什么是AOP?
- AOP:Aspect oriented Programing
- AOP是OOP的延续,OOP有3大特征:
- 封装、继承、多态
- OOP是纵向垂直的体系
- OOP编程思想可以解决大多数代码重复问题,但是有一些情况是处理不了的。比如在顶级父类中的多个方法中,相同位置出现了重复代码,OOP就解决不了,比如:方法开头日志打印,这部分代码被成为横切逻辑代码
- 横切逻辑代码的应用场景:事务控制、权限校验、日志…
- 横切逻辑代码存在的问题:
- 横切逻辑代码重复
- 横切逻辑代码和业务逻辑代码混淆在一起
- AOP出场:
- Aop另辟蹊径,将横切逻辑代码和业务代码分离
- 代码拆分容易,那么怎么在不修改业务逻辑的基础下,悄无声息的把横切逻辑代码应用到原有的业务逻辑中,道道和原来一样的效果,这个是比较难的
- AOP是OOP的延续,OOP有3大特征:
AOP解决什么问题?
在不改变原有业务逻辑的情况下,增强横切逻辑代码,根本上解耦,避免横切逻辑代码重复
为什么叫做面向切面编程?
切:指的是在不修改业务逻辑代码的情况下,只能修改逻辑代码,所以叫面向横切逻辑
面:横切逻辑代码往往要影响多个方法,每一个方法都如同一个点,多个点构成面,有一个面的概念在里面
Spring IoC基础
BeanFactory和ApplicationContext的区别?
BeanFactory是Spring框架中IoC容器的顶层接口,它只是定义了一些基础的功能和一些基础的规范。而ApplicationContext是他的一个子接口,所以ApplicationContext是具备BeaFactory提供的全部功能的。
通常,我们城BeanFactory为SpringIOC的基础容器,Appli cationContext是容器的高级接口,比BeanFactory要拥有更多的功能,比如说国际化支持和资源访问(xml,java配置类等等)
Bean实例化的三种方式
-
构造方法
<bean id="connectionUtils" class="com.xxx.ConnectionUtils"></bean>
-
静态方法
<bean id="connectionUtils" class="com.xxx.CreateBeanFactory" factory-method="createConnectionUtils">
-
实例方法
<bean id="createBeanFactory" class="com.xxx.CreateBeanFactory"></bean> <bean id="connectionUtils" factory-bean="createBeanFactory" factory-method="createConnectionUtils">
Bean的作用范围和生命周期
- singleton单例
- 对象出生:容器创建,对象创建
- 对象活着:容器在,对象一直活着
- 对象死亡:容器销毁,对象销毁
- prototype 原型
- 对象出生:当使用对象时,创建新的对象
- 对象活着:只要对象在使用,就一直活着
- 对象死亡:当对象长时间不使用时,被java的垃圾回收机制收回
DI依赖注入
- 依赖注入分类
- set方法注入
- 构造方法注入
启动IOC容器的方式
-
Java环境下启动IoC容器、
- ClassPathXmlApplicationContext:从类路径下加载配置文件
- FileSystemXmlApplicationContext:从磁盘路径上加载配置文件
- AnnotationConfigApplicationContext:纯注解模式下启动Spring容器
-
Web容器下启动IoC容器:
- 从xml中启动
<web-app> <!--配置Spring IoC容器--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <!--使用监听器启动SpringIOC容器--> <listener> <listenerclass>org.springframework.web.context.ContextLoaderListener</listenerclass> </listener> </web-app>
-
从配置类启动容器
<web-app> <context-param> <!--配置使用注解方式启动IOC容器--> <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.xxx.xxx.SpringConfig</param-value> </context-param> <!--使用监听器启动SpringIOC容器--> <listener> <listenerclass> org.springframework.web.context.ContextLoaderListener </listenerclass> </listener> </web-app>