1.何为Spring框架

Spring是一款轻量级的Java开发框架、提供两大核心功能Spring Ioc、Spring AOP。旨在提高开发人员的开发速度,方便与第三方服务进行集成等。

2.Spring模块组成

image.png
Spring Core:Spring中的核心模块,其他模块都依赖于该模块,主要提供Spring Ioc
Spring AOP&AspectJ:Spring AOP切面编程、AspectJ属于更强级别的切面
Spring Web:提供对Web、Websocket、Webflux等的支持
Spring Data Access: 提供对JDBC、ORM框架的支持。

3.Spring&SpringMVC&SpringBoot联系

Spring:主要提供一些核心功能的支持,通过Spring-Core提供核心的Spring IoC支持。Spring MVC模块的实现也要依赖于该模块。
Spring MVC:Spring MVC是一个基于Spring中的模块,用于快速构建MVC三层独立的项目结构。
SpringBoot:Spring开发过程中,需要配置大量的东西来支持项目的开发,而SpringBoot在这方面进行了极大的优化。通过自动配置来将中心移动到开发上,简化了繁琐的配置过程。

4.Spring Ioc&AOP

1.Spring IoC

Spring Ioc指的是将对象的创建、管理过程全部交给Spring框架来进行处理的思想。包含控制(对象创建、管理)、反转(交给Spring框架进行管理)

1.Ioc-解决的问题

Spring IoC通过控制反转实现了解决了以下问题
1.降低了对象之间的耦合度;
2.通过容器管理对象,使得对象更加方便进行创建和使用。

2.Spring AOP

Spring AOP是一种面向切面的编程技术、通过切面的形式对业务逻辑无代码入侵的形式来进行增加或者添加其他逻辑。Spring AOP是基于动态代理来进行实现的。
Spring AOP是运行时增强、Spring Aspectj是编译时增强

5.Spring Bean

Spring Bean中的Bean指的是那些被Spring容器管理的Bean对象、通常可以通过XML、注解等形式来注入并使用。

1.类注入

@Component:组件注解、通常用于将某一个类注册为Spring中的组件。
@Controller、@Service、@Repository这三个注解通常用于MVC三层开发模式中。

2.对象注入

@Bean:是自定义最强的注解、通常用于告诉Spring这是某一个类的对象实例。
@Autowired、JDK中的@Resource、@Inject都可进行Bean的注入。

3.@Autowired&@Resource区别

@Autowired是Spring中内置的注解、主要通过byType进行匹配、如果无法匹配则需要通过指定byName来进行注入。当一个接口存在多个实现类时,必须指定具体的实现类名称进行注入。
@Qualifier注解通常与Autowired配合使用,用来指定注入对象的名称

  1. // 报错,byName 和 byType 都无法匹配到 bean
  2. @Autowired
  3. private SmsService smsService;
  4. // 正确注入 SmsServiceImpl1 对象对应的 bean
  5. @Autowired
  6. private SmsService smsServiceImpl1;
  7. // 正确注入 SmsServiceImpl1 对象对应的 bean
  8. // smsServiceImpl1 就是我们上面所说的名称
  9. @Autowired
  10. @Qualifier(value = "smsServiceImpl1")
  11. private SmsService smsService;
  1. @ResourceJDK中提供的注解,优先通过byName进行注入,其次降级使用byType进行注入。

4.Spring Bean作用域

Singleton:将一个对象实例标注为单例对象,如何情况下只存在一个对象实例
Prototype:将一个对象实例标注为多例对象,每一次请求产生一个新的对象实例
Request:每一次新的HTTP请求都会产生一个实例,且该实例只在当前Request域中 有效。
Session:每一次Session会员都会产生一个实例,且该实例只在当前Session域中有效
Global-Session:全局有效、Spring5已经弃用。
上述作用域可以在XML、注解进行指定、@Scope()来进行标注。

5.Spring Bean线程安全问题?

Spring Bean中的单例对象,在多线程操作情况下存在线程安全问题(资源竞争)。通常可以通过以下两种方式进行解决
1.避免定义可变成员变量
2.可以通过ThreadLocal存储可变成员变量
但是,日常开发过程中,大部分都是无状态的,比如Service、Dao等。

6.Spring Bean生命周期

生命周期指的是Java类成为Bean对象的过程
Spring&SpringBoot - 图2
主要包含实例化Bean、属性注入、初始化方法、销毁方法
1.实例化Bean:
BeanFactory容器中,不存在当前Bean对象,则会通过createBean方法进行创建
ApplicationContext容器中,当容器启动时,则会全部初始化Bean对象到容器中。
2.属性注入:
如果实现了BeanNameAware接口,则会调用实现的setBeanName(String)方法,String为Spring配置文件中的id值。
3.初始化方法
BeanFactoryAware实现:该Bean实现了BeanFactoryAware,则会调用实现的setBeanFactory()方法,该方法可以获取到容器中的任意一个Bean来进行注入
ApplicationContextAware实现:该Bean实现了ApplicationContextAware接口,则会调用setApplicationContext()方法传递Spring上下文,来实现属性注入
postProcessBeforeInitialization接口实现-初始化预处理:如果一个对象实现了BeanPostProcessor接口,则会调用postProcessBeforeInitilization()方法进行初始化预处理
init-method:如果Bean在Spring配置了init-method苏醒明泽会自动调用初始化方法预处理
postProcessAfterInitialization: 如果这个Bean关联了BeanPostProcess接口,则会调用该方法来完成最后的初始化工作
4.对象销毁
如果Bean实现了DisposableBean接口,则会在销毁时调用destory()方法进行销毁。
如果指定了destory-method()属性,则会自动调用销毁方法。

7.Spring中的四种注入方法

构造器注入、set()方法注入、静态工厂注入、实例工厂注入

6.Spring事务

事务特性:原子性、一致性、隔离性、持久性ACID

1.事务类型

Spring中支持两种事务类型:一种是编程式事务管理(TransactionManager或者TransactionTemplate手动管理事务),另一种是通过声明式事务管理(通过@Transactionl注解实现)

2.事务传播行为

supports:存在事务则加入,不存在事务则无事务;
required:默认事务传播,存在事务则加入,不存在则创建事务;
never:永无事务、有事务则抛出异常
nested:存在,则嵌套事务、否则新建事务
required_new:创建新事务、如果存在,则挂起该事务
not_supports:无需事务、存在则抛出异常
mandatory:存在则加入、不存在则抛出异常

7.Spring中的设计模式

工厂模式:BeanFactory和ApplicationContext这两个Bean容器就是利用了工厂模式来负责对象的创建、和对象的获取。
单例模式:Spring中默认的Bean模式为单例模式、提供singleton作用域,也提供了其他几种不同的作用域
代理模式:Spring AOP中是基于动态代理进行实现的
模板方法、观察者模式

8.SpringMVC工作流程

image.png
1、客户端浏览器发送请求到服务端、也就是DispatcherServlet
2、DispatcherServlet会寻找相应的HandlerMapping映射来解析Handler
3、解析到Handler(Controller)之后,就会调用HandlerAdapter进行处理
4、HandlerAdapter会根据Handler调用真正的Controller来进行处理
5、处理完成之后、会返回一个ModelAndView给DispatcherServlet
6、ViewResolver解析View,Servlet将Model传递给View,然后进行视图渲染

9.SpringBootApplication注解及自动配置

该注解中主要包含了三个注解SpringBootConfiguration、EnableAutoConfiguration、ComponentScan注解

  1. @SpringBootConfiguration
  2. @EnableAutoConfiguration
  3. @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
  4. @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
  1. 在**SpringBootConfiguration中**包含了Configuration注解
  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. @Configuration
  5. @Indexed
  6. public @interface SpringBootConfiguration {}