Spring
1、简介
理念:使现有的技术更加容易使用,大杂烩,整合了现有的技术框架
SSM:SpringMVC+Spring+Mybatis
官网:https://spring.io/projects/spring-framework#overview
官方下载地址:https://repo.spring.io/release/org/springframework/spring/
Github地址:https://github.com/spring-projects/spring-framework
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
优点:
- 开源免费框架
- 轻量级,非入侵式框架 引入后对原来项目无影响
- 控制反转IOC,面向切面编程AOP
- 支持事务的处理,对框架整合的支持
组成
拓展
SpringBoot
- 快速开发的脚手架
- 基于SpringBoot可快速开发单个微服务
- 约定大于配置
SpringCloud
- 基于SpringBoot实现
弊端
发展了太久之后,违背了原有的理念,配置十分繁琐
2、IOC 控制反转
控制反转是一种通过描述(XML(beans)或注解)并通过第三方去生产或获取特定对象的方式。
在Spring中实现控制反转的是IOC容器,其实现方式是依赖注入(Dependency Injection,DI)
在配置文件加载的时候,容器中管理的对象进行初始化
创建对象的方式
- 使用无参构造创建对象
- 假设要使用有参构造,(下标,类型,参数名赋值)
<bean id="user" class="com.lucas.pojo.User">
<constructor-arg name="name" value="lucas"/>
</bean>
3、Spring配置
3.1、别名
<alias name="old" alias="new"/> 给对象赋别名,可以使用原名字和别名获取对象
3.2、Bean
id 对象名,唯一标识
class:包名+类型
name:别名,可以同时取多个
<bean id="" class="" name=", ,">
<property name="" value=""/> 参数
</bean>
3.3、Import
用于团队开发,可以将多个配置文件合并为一个
将各个人的beans.xml(名字随便取)合并为一个applicationContext.xml
<import resource="beans1.xml"/>
<import resource="beans2.xml"/>
4、依赖注入
4.1、构造器注入
4.2、Set方式注入
-
依赖注入:set注入
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的所有属性,由容器来注入
官方文档
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-collection-elements
注意点:p-namespace 和c-namespace 需要导入xml约束
4.3、作用域
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-scopes
单例模式 Spring默认机制
<bean id="accountService" class="com.something.DefaultAccountService"/>
<!-- the following is equivalent, though redundant (singleton scope is the default) -->
<bean id="accountService" class="com.something.DefaultAccountService" scope="singleton"/>
原型模式 每次从容器中get的时候都会产生新对象
<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>
其他只能用在web开发中
5、Bean的自动装配
Spring会在上下文中自动寻找,并自动给bean装配属性
在Spring中有三种装配方式:
- 在xml中显式地配置
- 在java显式配置
- 隐式地自动装配
- byname:保证所有bean的ID唯一,并且这个bean需要和自动注入的属性的set方法的值一致
- bytype:保证所有bean的class唯一,并且这个bean需要和自动注入的属性的类型一致
使用注解实现,better than 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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/> 注解的支持
</beans>
@Autowired
直接在属性上使用,也可以在set中使用
使用Autowired后不用编写set方法,前提是这个自动装配的属性在IOC容器中存在
@Autowired(required=false)
如果显式定义了Autowired的required属性为false,说明这个对象可以为null
@Qualifier(value=“xxx”)
自动装配环境复杂,无法通过一个@Autowired完成,则指定一个唯一的bean对象注入
@Resource(name="")
6、使用注解开发
6.1、bean
@Component
组件,放在类上 等价于
<bean id="" class=""/>
6.2、属性注入
@Value("")
<property name="" value=""/>
6.3、衍生注解
@Component有几个衍生注解,功能一样,在MVC三层架构中
- Dao 层 @Repository
- Service层 @Service
- Controller层 @Controller
6.4、自动装配置
@Autowired
直接在属性上使用,也可以在set中使用
使用Autowired后不用编写set方法,前提是这个自动装配的属性在IOC容器中存在
@Autowired(required=false)
如果显式定义了Autowired的required属性为false,说明这个对象可以为null
@Qualifier(value=“xxx”)
自动装配环境复杂,无法通过一个@Autowired完成,则指定一个唯一的bean对象注入
@Resource(name="")
6.5、作用域
@Scope(“singleton”)
@Scope(“prototype”)
7、XML和注解
xml更加万能,维护简单
注解 维护相对复杂
xml用来管理bean,注解完成属性的注入
8、使用Java的方式配置Spring
xml配置->Java 类
9、代理模式
分类:
- 静态代理
- 动态代理
9.1、静态代理
角色分析:
- 抽象角色:一般会使用接口或者抽象类来表示 接口
- 真实角色:被代理的角色
- 代理角色:代理真实角色
- 客户:访问代理对象
好处:
- 使真实角色的操作更加纯粹
- 公共交给了代理角色,实现业务的分工
- 公共业务扩展时方便管理
缺点:
- 一个真实角色产生一个代理角色,代码翻倍
9.2、动态代理
- 角色:和静态代理相同
- 动态代理的代理类是动态生成的
- 基于接口的动态代理,和基于类的动态代理
好处:
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理类可以代理多个类,只要实现同一个接口
10、AOP
横向编程思想,不影响之前代码
由代理引申而来
11、事务
确保完整性和一致性
ACID原则
真实角色
- 客户:访问代理对象
好处:
- 使真实角色的操作更加纯粹
- 公共交给了代理角色,实现业务的分工
- 公共业务扩展时方便管理
缺点:
- 一个真实角色产生一个代理角色,代码翻倍
9.2、动态代理
- 角色:和静态代理相同
- 动态代理的代理类是动态生成的
- 基于接口的动态代理,和基于类的动态代理
好处:
- 一个动态代理类代理的是一个接口,一般就是对应的一类业务
- 一个动态代理类可以代理多个类,只要实现同一个接口
10、AOP
面向切面编程
横向编程思想,不影响之前代码
由代理引申而来
11、事务
确保完整性和一致性
ACID原则