Spring相关概念
设计模式
三层架构
三层架构是一种十分完善的软件应用程序架构,它将应用程序组织成三个逻辑和物理计算层:表示层(或用户界面)、应用层(负责处理数据)和数据层(负责存储和管理与应用程序相关的数据)。 ——IBM
表示层(UI)
表示层是应用程序的用户界面和通信层,最终用户在此与应用程序进行交互。 其主要目的是向用户显示信息并从用户收集信息。
应用层(BLL)
应用层,也称为逻辑层或中间层,是应用程序的核心。 在这一层,通过业务逻辑(即一组特定的业务规则)来处理表示层中收集的信息,有时还包括数据层中的其他信息。 应用层还可以添加、删除或修改数据层中的数据。
数据层(DAL)
数据层有时称为数据库层、数据访问层或后端,用于存储和管理应用程序所处理的信息。 这可以是关系数据库管理系统,例如 PostgreSQL、MySQL、MariaDB、Oracle、DB2、Informix 或 Microsoft SQL Server,也可以是 NoSQL 数据库服务器,如 Cassandra、CouchDB 或 MongoDB。
在三层应用程序中,所有通信均通过应用层进行。 表示层和数据层无法直接相互通信。
graph TB 表示层UI<-->业务逻辑层BLL<-->数据访问层DAL<-->DB(DataBase)
处理请求的流程为:
graph TB Brower--request1-->Servlet1-->Service1-->D1(Dao1)-->DB((DB)) Brower--request2-->Servlet2-->Service2-->D2(Dao2)-->DB((DB))
MVC
MVC模式(Model View Controller)用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。
- 模型(Model):后端,包含了所有数据逻辑,可以直接对数据库进行访问
- 视图(View):前端界面或 GUI,负责展示数据,不包含程序逻辑
- 控制器(Controller):应用的大脑,控制数据如何展示
MVC架构同样尝试降低系统耦合度,分离不同的部分(视图和数据模型的分离、视图和表现逻辑(Controller)的分离),提高可维护性和工程化管理。
MVC模式可以看做是对三层架构中表现层的一种细分优化。
*框架(Framework)
框架是一组可重用的软件组件(Components)集合,是一个集成了基本结构、规范、设计模式、编程语言和程序库等基础组件的软件系统,旨在解决特定领域中的常见问题,帮助开发人员更高效、更稳定地实现软件开发目标。
站在文件结构的角度理解框架,可以将框架总结:框架 = jar包+配置文件
框架更像是约定好的规范,按照特定的范式,使用封装好的API,进行开发,降低开发过程中的沟通以及后续维护的成本
Spring
Spring 是一款主流的 Java EE 轻量级开源框架,目的是用于简化 Java 企业级应用的开发难度和开发周期。
广义上的Spring是由Spring发展而来的多个不同子项目(模块)组成的成熟技术,包括Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等。其中 Spring Framework 是其他子项目的基础和核心。
SpringFramework
SpringFramework是一个开源的应用程序框架,是Spring全家桶的其他所有框架的基础。
其核心概念和模块是IoC(Inverse of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程),此外还有DI(Dependency Injection,依赖注入)和TX(声明式事务管理)等
Spring IoC容器
IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序。
Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。
IoC 容器是 Spring 框架中最重要的核心组件之一,它贯穿了 Spring 从诞生到成长的整个过程。
组件是映射到应用程序中所有可重用组件的Java对象,应该是可复用的功能对象
Spring IoC 是一个容器,因为它包含并且管理组件对象的生命周期。组件享受到了容器化的管理,替程序员屏蔽了组件创建过程中的大量细节,极大的降低了使用门槛,大幅度提高了开发效率。
Spring管理组件的容器所进行的行为包括存储组件、创建和销毁组件、管理组件间依赖关系等
容器接口
BeanFactory
接口提供了配置框架和基本功能,能够管理任何类型的对象,它是SpringIoC容器标准化超接口
ApplicationContext
是 BeanFactory
的子接口。它是对BeanFactory
的扩展:
- 更容易与 Spring 的 AOP 功能集成
- 消息资源处理(用于国际化)
- 特定于应用程序给予此接口实现,例如Web 应用程序的
WebApplicationContext
IoC 容器管理配置方式
有三种配置方式:
- XML:使用XML文件配置,是最早的配置方式,当前开发已经很少用了
- 注解方式:在Bean类上添加相应的注解(如
@Component
@Service
@Autowired
)将Bean注册到 IoC 容器中 - Java配置类:在Java类中通过注解
@Configuration
@Bean
等实现Bean和依赖关系的配置
后两种配置方式采用较多。
总结
IoC容器
负责实例化、配置和组装Bean的核心容器
IoC 控制反转
IoC 主要是针对对象的创建和调用控制而言的,也就是说,当应用程序需要使用一个对象时,不再是应用程序直接创建该对象,而是由 IoC 容器来创建和管理,即控制权由应用程序转移到 IoC 容器中,也就是“反转”了控制权。这种方式基本上是通过依赖查找的方式来实现的,即 IoC 容器维护着构成应用程序的对象,并负责创建这些对象
DI 依赖注入
IoC 主要是针对对象的创建和调用控制而言的,也就是说,当应用程序需要使用一个对象时,不再是应用程序直接创建该对象,而是由 IoC 容器来创建和管理。DI就是 IoC 思想的实现
配置实例一
使用 @Configuration
注解将一个普通的类标记为 Spring 的配置类。
1 | import org.springframework.context.annotation.ComponentScan; |
测试创建 IoC 容器
1 | // AnnotationConfigApplicationContext 根据配置类创建 IOC 容器对象 |
@Configuration指定一个类为配置类,可以添加配置注解,替代配置xml文件
@ComponentScan(basePackages = {“包”,”包”}) 替代<context:component-scan标签实现注解扫描
@PropertySource(“classpath:配置文件地址”) 替代 <context:property-placeholder标签
配置实例二
将Druid连接池对象存储到 IoC 容器:第三方jar包的类添加到 IoC 容器,无法使用@Component等相关注解,因为源码jar包内容为只读模式
1 | //标注当前类是配置类,替代application.xml |
配置总结
使用@Configuration注解标记配置类
标记IoC注解:@Component, @Service, @Controller, @Repository
标记DI注解:@Autowired,@Qualifier,@Resource,@Value
引入外部配置文件:
@PropertySource({"classpath:application.properties","classpath:jdbc.properties"})
注解 | 说明 |
---|---|
@Component | 该注解用于描述 Spring 中的 Bean,它是一个泛化的概念,仅仅表示容器中的一个组件(Bean),并且可以作用在应用的任何层次,例如 Service 层、Dao 层等。 使用时只需将该注解标注在相应类上即可。 |
@Repository | 该注解用于将数据访问层(Dao 层)的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
@Service | 该注解通常作用在业务层(Service 层),用于将业务层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
@Controller | 该注解通常作用在控制层(如SpringMVC 的 Controller),用于将控制层的类标识为 Spring 中的 Bean,其功能与 @Component 相同。 |
面向切面编程AOP
AOP可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。它利用一种称为”横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为”Aspect”,即切面。所谓”切面”,简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
AOP思想主要的应用场景
AOP(面向切面编程)是一种编程范式,它通过将通用的横切关注点(如日志、事务、权限控制等)与业务逻辑分离,使得代码更加清晰、简洁、易于维护。AOP可以应用于各种场景,以下是一些常见的AOP应用场景:
- 日志记录:在系统中记录日志是非常重要的,可以使用AOP来实现日志记录的功能,可以在方法执行前、执行后或异常抛出时记录日志。
- 事务处理:在数据库操作中使用事务可以保证数据的一致性,可以使用AOP来实现事务处理的功能,可以在方法开始前开启事务,在方法执行完毕后提交或回滚事务。
- 安全控制:在系统中包含某些需要安全控制的操作,如登录、修改密码、授权等,可以使用AOP来实现安全控制的功能。可以在方法执行前进行权限判断,如果用户没有权限,则抛出异常或转向到错误页面,以防止未经授权的访问。
- 性能监控:在系统运行过程中,有时需要对某些方法的性能进行监控,以找到系统的瓶颈并进行优化。可以使用AOP来实现性能监控的功能,可以在方法执行前记录时间戳,在方法执行完毕后计算方法执行时间并输出到日志中。
- 异常处理:系统中可能出现各种异常情况,如空指针异常、数据库连接异常等,可以使用AOP来实现异常处理的功能,在方法执行过程中,如果出现异常,则进行异常处理(如记录日志、发送邮件等)。
- 缓存控制:在系统中有些数据可以缓存起来以提高访问速度,可以使用AOP来实现缓存控制的功能,可以在方法执行前查询缓存中是否有数据,如果有则返回,否则执行方法并将方法返回值存入缓存中。
- 动态代理:AOP的实现方式之一是通过动态代理,可以代理某个类的所有方法,用于实现各种功能。
综上所述,AOP可以应用于各种场景,它的作用是将通用的横切关注点与业务逻辑分离,使得代码更加清晰、简洁、易于维护。是一种区别于OOP的编程思维,用来完善和解决OOP的非核心代码冗余和不方便统一维护等问题。