SSM框架总结
前言
本文是个人学习记录的总结,知识点可能不全面,也可能有误,请注意鉴别。
Spirng
Spring组成
Spring框架由多个不同的模块组成,每个模块都提供了不同的功能,这些模块可以根据需要组合在一起使用。下面是Spring框架的组成:
- 核心容器(Core Container):
核心容器是Spring框架的最基本组成部分,包括IoC容器和BeanFactory。IoC容器负责管理Java对象的生命周期和依赖关系,Bean Factory则是IoC容器的底层实现。 - Spring上下文(ApplicationContext):
Spring上下文是IoC容器的扩展,它提供了更多的企业级服务,如国际化、事件传递、资源加载等。 - Spring AOP和Instrumentation(AOP and Instrumentation):
SpringAOP和Instrumentation模块提供了面向切面编程(AOP)的功能和JVM监控和管理(Instrumentation)的能力。 - 数据访问/集成(Data Access/Integration):
数据访问/集成模块提供了对JDBC、ORM(如Hibernate、MyBatis)、事务管理、消息传递等方面的支持。 - Web(Web):
Web模块提供了基于MVC模式的Web框架,包括Spring MVC、WebSocket、Rest等。 - Test(Test):
Test模块提供了对Spring应用程序进行单元测试和集成测试的支持。 - Aspects(Aspects):
Aspects模块提供了面向切面编程(AOP)的基本实现。 - Instrumentation(Instrumentation):
Instrumentation模块提供了JVM监控和管理的能力。 - Messaging(Messaging):
Messaging模块提供了对消息传递机制的抽象和实现。 - Core Container Extensions(Core Container Extensions):
Core Container Extensions模块提供了对Spring IoC容器的扩展,包括Spring Expression Language(SpEL)和AspectJ集成等。
Spring核心知识
IoC
-
IoC(Inversion of Control,控制反转)是Spring框架的核心概念之一,它是一种设计模式,也称为依赖注入(Dependency Injection, DI)。在传统的编程模式中,对象之间的依赖关系是由程序员手动创建和维护的,而在IoC模式下,控制权由程序员转移到了框架中,框架负责创建和维护对象之间的依赖关系,从而实现了对象之间的松耦合。
-
在Spring框架中,IoC容器负责管理对象的生命周期和依赖关系。容器会根据配置文件或Java注解创建对象,并将这些对象装配到容器中。当其他对象需要访问这些对象时,容器会自动将它们注入到其他对象中,从而实现了依赖注入。通过IoC容器,开发人员可以将应用程序中的各个部分进行解耦,从而实现了更高的灵活性和可维护性。
-
Spring框架提供了两种IoC容器实现:BeanFactory和ApplicationContext。BeanFactory是IoC容器的基本实现,提供了对象的创建和装配等基本功能。ApplicationContext是BeanFactory的子类,提供了更多的企业级服务,如国际化、事件传递、资源加载等。
-
总之,IoC是Spring框架的核心概念,通过IoC容器管理对象的生命周期和依赖关系,实现了对象之间的松耦合,提高了应用程序的灵活性和可维护性。
IoC容器将对象创建和管理的权利交给了Spring框架,这是实现依赖注入(DI)的前提。
DI
-
DI(Dependency Injection,依赖注入)是Spring框架的核心概念之一,它是一种实现IoC(Inversion of Control,控制反转)的方式。在传统的编程模式中,对象之间的依赖关系是由程序员手动创建和维护的,而在DI模式下,控制权由程序员转移到了框架中,框架负责创建和维护对象之间的依赖关系,从而实现了对象之间的松耦合。
-
DI是指通过构造方法、工厂方法或属性的方式将对象的依赖关系注入到对象中。在Spring框架中,开发人员可以通过在Bean配置文件或Java注解中定义依赖关系,告诉Spring框架哪些对象需要注入到哪些对象中。当IoC容器创建Bean的时候,它会自动将依赖的对象注入到其他对象中,从而实现了依赖关系的自动管理。
-
DI有三种方式:构造方法注入、Setter方法注入和接口注入。构造方法注入是通过Bean的构造方法来注入依赖,Setter方法注入是通过Bean的Setter方法来注入依赖,接口注入是通过Bean实现接口来注入依赖。在实现依赖注入的过程中,开发人员可以根据业务需求选择合适的注入方式。
-
总之,DI是Spring框架的核心概念之一,通过将对象的依赖关系注入到对象中,实现了对象之间的松耦合。通过DI,开发人员可以将应用程序中的各个部分进行解耦,从而实现了更高的灵活性和可维护性。
DI实现了松耦合,增加了程序的可扩展性、易维护性。
AOP
-
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,它可以帮助开发人员将系统中各个模块之间的横切关注点进行解耦,从而提高了系统的可维护性和可扩展性。AOP是Spring框架的核心概念之一,它通过将系统中的横切关注点(如日志、事务、安全性等)抽象成切面,然后将这些切面应用到系统中的各个模块中,从而实现了横切关注点的复用。
-
在AOP中,切面由切点和通知组成。切点定义了在哪些位置插入通知,通知定义了在切点处要执行的逻辑。通知可以分为前置通知(在方法执行之前执行)、后置通知(在方法执行之后执行)、环绕通知(在方法执行前后都执行)等几种类型。
-
Spring框架提供了多种AOP实现方式,包括基于代理的AOP和基于字节码生成的AOP。在基于代理的AOP中,Spring框架通过动态代理技术,在运行时创建代理对象,将切面逻辑织入到代理对象的方法中。在基于字节码生成的AOP中,Spring框架通过在编译时修改字节码,将切面逻辑织入到目标对象的方法中。这两种实现方式各有优缺点,开发人员可以根据具体的业务场景选择合适的实现方式。
-
总之,AOP是一种编程范式,可以帮助开发人员将系统中各个模块之间的横切关注点进行解耦,提高了系统的可维护性和可扩展性。Spring框架提供了多种AOP实现方式,可以满足不同的业务场景需求。
AOP是一种编程思想,它能抽取通用的代码以简化开发、降低冗余。
Spring常用组件
- Bean:
Bean是Spring框架中最基本的组件,它是由Spring容器创建、管理和维护的。Bean可以通过XML文件或Java注解进行配置,可以将Bean注入到其他Bean中,实现依赖注入。 - IoC容器:
IoC容器是Spring框架的核心组件,它负责管理Bean的生命周期和依赖关系。Spring提供了两种IoC容器实现,BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子类,提供了更多的企业级服务。 - AOP框架:
Spring框架提供了一个AOP(面向切面编程)框架,可以实现横切逻辑的复用、降低耦合度、提高代码可读性和可维护性等优势。 - 数据访问/集成组件:
Spring框架提供了对JDBC、ORM(如Hibernate、MyBatis)、事务管理、JMS等方面的支持,可以帮助开发人员简化数据访问和集成的操作。 - Spring MVC框架:
Spring MVC框架是Spring框架的一部分,提供了一个基于MVC模式的Web应用框架,可以帮助开发人员简化Web应用的开发。 - Spring Security框架:
Spring Security框架是一个安全框架,可以帮助开发人员实现用户认证、授权、密码加密、会话管理等安全控制功能,保障应用的安全性。 - Spring Test组件:
Spring框架提供了对Spring应用程序进行单元测试和集成测试的支持,可以帮助开发人员测试和验证应用程序的正确性。 - Spring Web Services框架:
Spring Web Services框架提供了对Web服务的支持,可以帮助开发人员创建和发布Web服务。 - Spring Batch框架:
Spring Batch框架是一个批处理框架,可以帮助开发人员简化批处理操作,实现高效的数据处理和管理。
常用注解
注解 | 含义 |
---|---|
@Component | 通用的注解,用于标识一个组件类。 |
@Controller | 用于标识一个控制器类。 |
@Service | 用于标识一个服务类。 |
@Repository | 用于标识一个数据访问组件类。 |
@Autowired | 自动注入依赖关系。 |
@Qualifier | 指定自动注入的Bean名称。 |
@Value | 注入属性值。 |
@RequestMapping | 映射URL到控制器方法或服务方法。 |
@PathVariable | 获取URL中的参数值。 |
@RequestParam | 获取请求参数的值。 |
@ResponseBody | 将方法返回值直接写入到响应体中。 |
@ExceptionHandler | 处理异常。 |
@Configuration | 标识一个配置类。 |
@Bean | 在配置类中声明一个Bean。 |
@Import | 导入其他配置类。 |
@Profile | 指定配置文件的环境。 |
@Transactional | 开启事务支持。 |
@Aspect | 标识一个切面。 |
@Pointcut | 定义切点。 |
@Before、@After、@Around | 定义切面的通知类型。 |
spring 中 bean 对象的⽣命周期
对象的生命周期被分成了1.创建阶段 2.初始化 3.使用 4.销毁
- 单例对象在spring容器创建的时候就会被创建出来,而多例的对象会在ac.getBean()的时
候创建出对象。 - spring会对对象的属性进行依赖的注入。
- 执行BeanPostProcessor的前置处理。
- 执行InitializingBean接口的初始化方法。
- 执行bean标签中配置的init-method的初始化方法。@PostConstruct这个注解key替代in
it-method配置 - 执行BeanPostProcessor的后置处理的方法。
- 到此整个bean对象创建完毕,我们就使用这个bean对象。
- 在spring容器要销毁对象的时候,bean会执行销毁操作,先执行DisposableBean接口的销
毁方法。 - 执行配置在bean标签上面的destory-method的方法。 对应的注解是@PreDestroy
Spring 中有哪⼏种⽅式把 bean 对象交给 IOC 容器
- Bean注解加上,Configuration
- 使用Component注解。
- 使用Import注解,可以导入一个普通的类,也可以导入一个ImportSelector
- 可以实现FactoryBean接口。
- 可以实现BeanDefinitionRegistryPostProcessor接口,手动向容器中注册BeanDefini
tion
Spring 事务失效的⼏个场景
- 抛出检查异常导致事务不能回滚
a. Spring 默认只能回滚运⾏时异常。
b. 解决办法就是配置 rollbackfor 属性 - 业务⽅法内⾃⼰处理了异常
a. 事务通知类中只有捕捉到异常后才有可能事务回滚,在业务类中⾃⼰把异常处
理了就相当于没有异常发⽣。
b. 解决办法是捕捉到异常处理后再⼿动抛出⼀下。 - ⾮ public ⽅法导致事务失效
a. Spring 为⽅法添加代理,添加事务通知的前提是业务⽅式必须是 public
b. 解决办法就是把⽅法改为 public - 调⽤本类中的其他⽅法会导致事务失效。
a. 本类中的其他⽅法调⽤时不会经过代理,因此⽆法增强。
b. 把⾃⼰通过注⼊的⽅式作为属性,然后调⽤⽅法。
SpringMVC
基本组成
-
DispatcherServlet:是Spring MVC的核心组件,它是一个Servlet,用于接收所有的HTTP请求,并将请求分发给适当的处理程序(Controller)来处理。
-
HandlerMapping:用于将请求URL映射到对应的Controller。
-
Controller:用于处理请求,并返回一个ModelAndView对象,其中包含了视图名称和模型数据。
-
ViewResolver:用于将视图名称解析为View对象。
-
View:用于将模型数据生成HTML等内容。
-
Interceptor:用于在Controller处理请求前后执行额外的逻辑,如权限控制、日志记录等。
-
ExceptionHandler:用于处理Controller中抛出的异常。
-
转换器(Converter)和格式化器(Formatter):用于在Controller中处理请求参数和响应结果的类型转换和格式化。
-
校验器(Validator):用于在Controller中对请求参数进行校验。
常用注解
注解 | 说明 |
---|---|
@Controller | 声明一个Spring MVC的Controller类 |
@RequestMapping | 将HTTP请求映射到Controller的处理方法上 |
@RequestParam | 获取HTTP请求中的参数值 |
@PathVariable | 获取URL路径中的变量值 |
@ResponseBody | 将方法返回的对象序列化为JSON或XML等格式的响应结果 |
@RequestBody | 将HTTP请求的内容绑定到方法的参数上 |
@ModelAttribute | 将HTTP请求的参数绑定到Model对象上 |
@SessionAttribute | 将HTTP Session中的属性绑定到Model对象上 |
@InitBinder | 注册数据绑定器 |
@ExceptionHandler | 处理Controller方法抛出的异常 |
@ResponseStatus | 设置HTTP响应的状态码 |
@CrossOrigin | 允许跨域访问 |
@Validated | 标记需要验证的方法参数 |
@Valid | 声明对象需要被验证 |
@Autowired | 自动装配Spring组件 |
@Qualifier | 指定自动装配的Bean名称 |
@Resource | 自动装配Java EE组件 |
@Value | 注入属性值 |
@Configuration | 声明一个Spring配置类 |
@ComponentScan | 扫描指定包下的组件 |
@Bean | 声明一个Spring Bean |
@Profile | 指定Bean的配置环境 |
@EnableWebMvc | 启用Spring MVC的配置 |
@EnableTransactionManagement | 启用Spring事务管理 |
@Transactional | 声明一个事务性方法 |
SpringMVC 处理请求的流程
- 客户端(浏览器)发送请求,直接请求到 DispatcherServlet(核心控制器)。
- DispatcherServlet 根据请求信息调用 HandlerMapping(映射器),解析请求
对应的 Handler(控制器)。 - 解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 H
andlerAdapter 适配器处理。 - HandlerAdapter 会根据 Handler来调用真正的处理器开处理请求,并处理相应的
业务逻辑。 - 处理器处理完业务后,会返回一个 ModelAndView(模型和视图) 对象,Model 是
返回的数据对象,View 是个逻辑上的 View。 - ViewResolver(视图解析器) 会根据逻辑 View 查找实际的 View。
- DispaterServlet 把返回的 Model 传给 View(视图渲染)。
- 把 View 返回给请求者(浏览器)
什么是Spring MVC?它的主要特点是什么?
Spring MVC是基于Spring框架的MVC模式的Web框架,它允许开发人员使用面向对象的方式来设计和实现Web应用程序,提高了Web应用程序的可维护性和可扩展性。Spring MVC的主要特点包括灵活的URL映射、强大的视图解析、支持多种视图技术、易于测试等。