锐锋产乎钝石,明火炽乎暗木
1. 简介
1.1 定义
Spring认证框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。
1.2 背景
- 2002年,Spring框架雏形:interface21框架
- 2004年3月24日,发布1.0正式版本
- Rod Johnson,Spring Framework创始人,音乐学家,轮子理论
- SSH:Struts,Spring,Hibernate或SpringMVC,Spring,Hibernate
- SSM:SpringMVC,Spring,Mybatis
- SpringBoot:约定大于配置
- SpringCloud
1.3 理念
使现有技术更加容易使用,本身是一个大杂烩,整合了现在的技术框架
1.4 获取
1 | <dependency> |
1.5 优点
- 开源、免费的框架(容器)
- 轻量级、非入侵式的框架
- 控制反转(IOC)、面向切面编程(AOP)
- 支持事务的处理,对框架整合的支持
1.6 组成
2. IOC(Inversion of Control思想,DI是其一种实现方法)
有很多实现方式,注解零配置(约定大于配置)、XML配置
2.1 核心内容
IOC控制反转是一种设计思想,没有IOC的程序,对象的创建和对象间的依赖关系完全依赖,有IOC后,对象的创建,管理,装配由Spring控制
2.2 IOC创建对象
在配置文件加载的时候,bean就被实例化了
- 构造器注入
1 | <bean id="hello" class="com.xxy.entity.Hello"> |
- set方式注入【依赖注入DI】
- 实体类
1 | package com.xxy.entity; |
1 |
|
- 其他方式注入
注意p和c标签不能直接使用,需要导入命名空间
1 | xmlns:p="http://www.springframework.org/schema/p" |
- p标签注入,相当于property
1 |
|
- c标签注入,相当于构造器注入
1 |
|
3. Spring 配置
3.1 别名
1 | <alias name="hello" alias="hello1"></alias> |
3.2 Bean的配置
1 | <!--id:bean唯一标识符,相当于对象名--> |
3.3 import
用于合并多个配置文件,多用于团队开发
1 |
|
3.4 bean作用域
scope默认是单例,singleton,prototype每次get产生一个新对象,其余requese、session、application这些只在web中使用
1 | <bean id="hello1" class="com.xxy.entity.Hello" p:name="s" scope="singleton"> |
3.5 Bean自动装配
- 在XML显示的配置
byName需要保证bean的id唯一,byType需要保证bean的class唯一,而且都要和set方法的值或类型一致
1 | <bean id="hello1" class="com.xxy.entity.Hello" p:name="s" scope="singleton" autowire="byName"> |
- 在java中显示配置
jdk1.5支持注解,spring2.5支持注解
1 |
|
@Autowired可以直接在属性上使用,也可以在Set方式上使用,通过ByType实现
序号 | 注解 | 解释 |
---|---|---|
1 | @Qualifier(value = “hell01”) | @Autowired环境复杂,可以通过此注解指定唯一bean注入 |
2 | @Resource | 首先通过byName寻找,找不到通过byType寻找 |
3 | @Nullable | 标记这个注解,说明允许为空 |
- 隐式的自动装配
3.6 Java配置Spring
spring4之后成为了核心功能,以前是一个子项目,SpringBoot很常见
1 |
|
4. 使用注解开发
在spring4之后,使用注解必须保证aop的包导入,然后是命名空间约束,维护较为复杂,不是所有场景能够使用
序号 | 注解 | 解释 |
---|---|---|
1 | @Component | 组件,放在类上,说明被Spring管理 |
2 | @Value(value = “li”) | 属性注入,最好放在set方法上 |
3 | @Repository | 标记这个注解,说明是数据访问层 |
4 | @Service | 标识为业务逻辑层 |
5 | @Controller | 标识为控制层 |
6 | @Scope(value = “singleton”) | bean作用域 |
7 | @Configuration | 用java配置spring,标识为配置类,通常和@Bean一起使用,类似于beans |
5. AOP(Aspect Oriented Programming)
5.1 代理模式
5.1.1 静态代理
一个真实角色会产生一个代理角色,开发效率会降低
- 抽象角色
- 代理角色
- 真实角色
- 客户
5.1.2 动态代理
代理类是动态生成的,Proxy,InvocationHandler,本质是使用反射机制实现的
- 基于接口【Jdk动态代理】
- 基于类【cglib动态代理】
- Java字节码【javassist】
5.2 AOP(默认为JDK动态代理)
5.2.1 通过Spring的AOP自带的API实现
- 导包
1 | <dependency> |
- 被代理的类
1 | package com.xxy.service; |
1 | package com.xxy.service; |
- 代理
1 | package com.xxy.utils; |
- 配置文件
1 |
|
- 测试
1 | package com.xxy.test; |
5.2.2 自定义的切面实现
1 | <aop:config> |
5.2.3 注解实现
1 | <bean id="annotationPointCut" class="com.xxy.utils.AnnotationPointCut"></bean> |
1 | package com.xxy.utils; |
优先级:环绕前-方法执行前-方法-环绕后-方法执行后-最终执行
- cglib动态代理
1 | <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy> |
6. 整合Mybatis
6.1 导包
spring相关
spring-mybatis【注意版本】spring-mybatis
MyBatis-Spring | MyBatis | Spring Framework | Spring Batch | Java |
---|---|---|---|---|
3.0 | 3.5+ | 6.0+ | 5.0+ | Java 17+ |
2.1 | 3.5+ | 5.x | 4.x | Java 8+ |
2.0 | 3.5+ | 5.x | 4.x | Java 8+ |
1.3 | 3.4+ | 3.2.2+ | 2.1+ | Java 6+ |
- mybatis相关
1 |
|
6.2 编写配置文件
1 |
|
6.3 编写实体类
1 | public class User { |
1 | package com.xxy.mapper; |
1 | package com.xxy.mapper; |
1 |
|
6.4 测试
1 | package com.xxy.test; |
7. 事务
ACID非常重要
7.1 声明式事务[不影响代码]
1 | <!--配置事务管理器--> |
1 | <!-- 事务管理器,依赖于数据源 --> |
7.2 编程式事务
会改变代码结构
8. 总结
学习了Spring框架,最主要是IOC和AOP的理解