「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战」
Spring
是什么
Spring是一种轻量级的开发框架。为了提高开发人员的开发效率以及系统的可维护性。
Spring框架是多模块的集合。
优点:
- 开源免费框架
- 轻量级、非入侵的(不会影响其他模块)
- 控制反转(IoC)(低耦合) 、面向切面(AOP)
- 事务处理,对框架的整合处理
Spring是一个轻量级控制反转(IoC)、面向切面的开源框架
什么是侵入式
侵入式:会改变java类结构
非侵入式:对现有的类结构没有影响
七大模块
-
Spring Boot
- 是一个快速开发的脚手架
- 可以使用SpingBoot快速开发单个微服务
- 约定大于配置
-
Spring Cloud
- 基于Spring Boot实现的
IoC
是一种设计思想。将原来由程序手动创建对象的控制权,交给Spring框架管理。
IoC容器是Spring实现IoC的载体。(IoC容器就是Map)
开发人员不用去管理对象的创建,专注于业务的开发。降低系统的耦合性。
DI(依赖注入)是实现Ioc的一种方式。
依赖倒置原则(Dependency Inversion Principle)
下层依赖上层。
AOP
面向切面编程。将与业务无关的,但是与业务模块无法分离的,如日志、事务、权限等封装起来。减少系统重复的代码,降低耦合性,提高系统的可维护性、可拓展性。
Spring AOP就是基于动态代理的。
Spring AOP和AspectJ AOP的区别
Spring AOP运行时增强,基于代理。
AspectJ AOP编译时增强,基于字节码。
Spring AOP集成了AspectJ(复杂,切面多的话,效率更高)。
Spring AOP:简单、易上手
AspectJ:复杂,切面多的话,效率更高
切面少,两者性能差不多。
IoC创建对象
-
基于 XML 的配置元数据
-
默认使用无参构造函数
-
使用有参构造函数
-
下标赋值
<bean id="User" class="com.lkk.entity.User"> <constructor-arg name="name" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg> </bean> -
类型(不建议使用)
<bean id="User" class="com.lkk.entity.User"> <constructor-arg type="java.lang.String" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg> </bean> -
参数名
<bean id="User" class="com.lkk.entity.User"> <constructor-arg index="0" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg> </bean>
-
-
Spring配置
别名
<bean id="User" class="com.lkk.entity.User">
<constructor-arg type="java.lang.String" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg>
</bean>
<alias name="User" alias="user"></alias>
Bean的配置
<bean id="User" class="com.lkk.entity.User" name="user1,user2">
<constructor-arg name="name" value="你爱我 我爱你 蜜雪冰城甜蜜蜜"></constructor-arg>
</bean>
import
<import resource="bean.xml"></import>
<import resource="bean2.xml"></import>
Spring Bean
bean的作用域
| 作用域 | 说明 |
|---|---|
| singleton(默认) | 唯一bean实例 |
| prototype | 每次请求都会出创建一个实例 |
| request | 每次HTTP请求产生一个新的bean,仅在当前HTTP request内有效 |
| session | 每次HTTP请求产生一个新的bean,仅在当前HTTP session内有效 |
| application | |
| websocket |
单例bean的线程安全问题
常用的 Controller、Service、Dao 这些 bean 是无状态的。
无状态的 bean 不能保存数据,因此是线程安全的。
解决方式:
ThreadLocal成员变量,将可变的成员变量保存在ThreadLocal中- 改变bean的作用域为prototype
@Component和@Bean的区别
-
作用对象:@Component作用在类上;@Bean作用在方法上。
-
@Component:通常是类路径扫描(@ComponentScan)来自动装配至Spring容器
@Bean:在标有@Bean注解的方法中定义bean
-
@Bean的自定义更强,某些特定情况只能使用@Bean。
将类声明为Spring的bean
可以通过@Autowired自动装配bean。类应该怎样让@Autowired识别到呢?
@Repository
@Service
@Controller
@Component
bean的生命周期
Spring MVC
MVC是一种设计模式,Spring MVC是一种MVC框架,
Spring MVC工作原理时序图
Spring用到了哪些设计模式?
- 代理设计模式
- 工厂设计模式
- 单例设计模式
- 模板方法模式
- 包装器设计模式
- 观察者模式
- 适配器模式