Spring:
框架:
具有一定功能的半成品软件,基于框架会节省开发成本
框架作用:
提高开发效率、复用性、编写规范、节约维护成本、解耦底层实现原理
Spring:
- Spring是
分层
的JavaSE/EE应用full-stack轻量级开源
框架 - Spring主要是做整合,可以理解是一搜航空母舰,上面放置了很多的战斗机
- Spring核心是
IOC
(控制反转) 和AOP
(面向切面编程) - Spring提供了对各种优秀框架的支持和
整合
Spring优点:
- IOC解耦
- 可以将对象间的依赖关系交由spring管理
- 避免硬编码造成的程序间过渡耦合
- 支持AOP
- 可以使用切面编程思想对方法进行增强
- 支持声明式事务
- 可以通过配置或者注解的方式管理事务
- 不需要硬编码管理事务
- 方便测试
- 可以通过注解方便的测试Spring程序
- 方便集成
- 其内部提供了对各种优秀框架的直接支持
- 使用简单
- Spring对很多难用的API做了简单的封装
- 设计精良
- Spring的源码设计精妙、结构清晰值得学习
不使用Spring会有什么影响:
会造成(常见的):
- 依赖问题
- 耦合问题
- 实现类丢失会影响其他层
2. 实现类切换会影响其他层- 创建顺序
- 对象个数
Spring体系结构:
Data Access/Integration
- JDBC: 对各大数据库厂商进行抽象处理
- ORM: 集成orm框架支持对象关系映射处理
- OXM: 提供了对 Object/XML映射实现的抽象层
- JMS: 主要包含了一些制造和消费消息的特性
- Transactions: 支持编程和声明式事务管理
Web
- Websocket: 提供了WebSocket和SocketJS的实现
- Servlet: 利用MVC(model-view-controller)的实现分离代码
- Web: 提供了基础的面向 Web 的集成特性(如: 文件上传)
- Portlet: 提供了Portlet环境下的MVC实现
中间层
- AOP: 提供了符合AOP要求的面向切面的编程实现
- Aspects: 提供了与AspectJ的集成功能
- Instrumentation: 提供了类植入(Instrumentation)的支持和类加载器的实现
- Messaging: 用于构建基于消息的应用程序
Core Container
- Beans: Bean工厂与bean的装配
- Core: 依赖注入IoC与DI的最基本实现
- Content: IOC容器的企业服务扩展
- SpEl: 用于在运行时查询和操纵对象的表达式
Test
- 支持使用 JUnit 和 TestNG 对 Spring 组件进行测试
耦合&内聚:
耦合(Coupling)
代码书写过程中所使用技术的结合紧密度,用于衡量软件中各个模块之间的互联程度
内聚(Cohesion)
代码书写过程中单个模块内部各组成部分间的联系,用于衡量软件中各个模块内部的功能联系
程序书写的目标:高内聚、低耦合
,就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度不要那么紧密
配置文件耦合不是java类耦合,解决耦合问题
IOC容器:
- IoC(Inversion Of Control)控制反转,Spring反向控制应用程序所需要使用的外部资源,转交给第三方(工厂)完成
- Spring控制的资源全部放置在Spring容器中,该容器称为IoC容器
- Ioc就是从自己new对象,变成spring给你对象,都放在ioc容器里
IOC的作用:
- 解耦: 利用IOC的工厂模式解耦创建对象的过程
- 解决代码耦合度过高问题
- 存储对象: 可以将创建好的对象 存储 起来重复使用
- 解决对象个数问题
- 管理依赖关系: 可以将依赖对象注入需要的对象当中
- 解决依赖关系问题
- 管理对象创建顺序: 可以根据依赖关系先后创建对象
- 解决创建顺序问题
入门案例:
- 导入spring坐标(5.1.9.release)
<dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.5</version></dependency></dependencies>
- 编写业务层与表现层(模拟)接口与实现类
public interface UserService {public void save();
}
public class UserServiceImpl implements UserService {@Overridepublic void save() {System.out.println("UserService执行");}
- 建立spring配置文件,配置所需资源(Service)为spring控制的资源
<?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"><!--创建spring控制资源 id随便写,class写实现类--><bean id="userService" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
</beans>
- 测试
public class UserServiceTest {@Testpublic void save() {// 加载配置文件ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取资源UserService userService = (UserService) ctx.getBean("userService");userService.save();}
}
IoC配置(XML格式)
bean
- 名称:bean
- 类型:标签
- 归属:beans标签
- 作用:定义spring中的资源,受此标签定义的资源将受到spring控制
属性 | 说明 |
---|---|
id | 对象的引用名称;一定要唯一; 一次只能定义一个引用名称,通过id值获取bean |
name | 对象的引用名称; 与id区别是:name一次可以定义多个引用名称。 |
class | bean的类型,类的全限定名称 |
init-method | 指定类中初始化方法的名称,在构造方法执行完毕后立即执行 |
destroy-method | 指定类中销毁方法名称,在销毁spring容器前执行 |
lazy-init | 设置为true表示在第一次使用对象的时候才创建,只对单例对象有效。 |
scope | 设置bean的作用范围, 取值: singleton:单例, 默认值; prototype:多例 request:web项目中,将对象存入request域中 session:web项目中,将对象存入session域中 globalsession:web项目中,将对象应用于集群环境,没有集群相当于session |
格式:
<beans><bean />
</beans>
基本属性:
<!-- id:bean的名称,通过id值获取beanclass:bean的类型name:bean的名称,可以通过name值获取bean,用于多人配合时给bean起别名,可以定义多个,用逗号隔开,测试类写哪个都可以获取
--><bean id="userService" name="userService2,userService3" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
- BeanFactory是Spring容器的顶层接口, 采用 延迟创建 对象的思想
- ApplicationContext是BeanFactory的子接口, 采用 即时创建 对象的思想
bean属性scope
-
名称:scope
-
类型:属性
-
归属:bean标签
-
作用:定义bean的作用范围
-
格式:
<!--scope: 设置对象的作用范围singleton: 默认值, 表示为单例模式: 对象只创建一次prototype: 多例模式, 标识对象每次使用都创建一个新的 (并且不会将对象存储到IOC容器中)--><bean init-method="init" destroy-method="destroy" scope="prototype" class="com.itzhuzhu.service.impl.UserServiceImpl"/>
@Testpublic void save2() {// 加载配置文件ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");// 获取资源UserService userService = (UserService) context.getBean("userService");UserService userService2 = (UserService) context.getBean("userService");System.out.println(userService);System.out.println(userService2);System.out.println(userService == userService2);/* singleton打印结果com.itzhzhu.service.impl.UserServiceImpl@3f6f6701com.itzhzhu.service.impl.UserServiceImpl@3f6f6701trueprototype打印结果com.itzhzhu.service.impl.UserServiceImpl@52b1beb6com.itzhzhu.service.impl.UserServiceImpl@273e7444false
*/}
取值:
singleton
(默认配置):设定创建出的对象保存在spring容器中,是一个单例的对象,地址值都一样的,加载spring容器的时候就会初始化prototype
:设定创建出的对象保存在spring容器中,是一个非单例的对象,加载容器不初始化,获取的对象时候创建,用一个创建一个request、session、application、 websocket
:设定创建出的对象放置在web容器对应的位置
bean生命周期
-
名称:init-method,destroy-method
-
类型:属性
-
归属:bean标签
-
作用:定义bean对象在初始化或销毁时完成的工作
-
格式:
<bean init-method="init" destroy-method="destroy></bean>
取值:bean对应的类中对应的具体方法名
注意事项:
-
当scope=“singleton”时,spring容器中有且仅有一个对象,init方法在创建容器时仅执行一次
-
当scope=“prototype”时,spring容器要创建同一类型的多个对象,init方法在每个对象创建时均执行一次
-
当scope=“singleton”时,关闭容器会导致bean实例的销毁,调用destroy方法一次
-
当scope=“prototype”时,对象的销毁由垃圾回收机制gc()控制,destroy方法将不会被执行
bean对象创建方式
factory-bean
如果项目之前没有使用Spring会用到这种方式
-
名称:factory-bean
-
类型:属性
-
归属:bean标签
-
作用:定义bean对象创建方式,使用静态工厂的形式创建bean,兼容早期遗留系统的升级工作
-
格式:
<bean class="FactoryClassName" factory-method="factoryMethodName"></bean>
取值:工厂bean中用于获取对象的静态方法名
注意事项:
- class属性必须配置成静态工厂的类名
factory-bean,factory-method
-
名称:factory-bean,factory-method
-
类型:属性
-
归属:bean标签
-
作用:定义bean对象创建方式,使用实例工厂的形式创建bean,兼容早期遗留系统的升级工作
-
格式:
<!--实例工厂对应的bean-->
<bean id="factoryBeanId" class="类路径"/>
<!--实例工厂创建bean。依赖工厂对象对应的bean factory-bean写上面的id,method写对应的方法名-->
<bean id="起名" factory-bean="对应上面的bean id" factory-method="factoryMethodName"/>
取值:工厂bean中用于获取对象的实例方法名
注意事项:
-
使用实例工厂创建bean首先需要将实例工厂配置bean,交由spring进行管理
-
factory-bean是实例工厂的beanId