软件设计之SSM(1)
路线图推荐:
【Java学习路线-极速版】【Java架构师技术图谱】
尚硅谷新版SSM框架全套视频教程,Spring6+SpringBoot3最新SSM企业级开发
资料可以去尚硅谷官网免费领取
学习内容:
- Spring框架结构
- SpringIoC容器
- SpringIoC实践与应用
1、Spring框架结构
Spring是一个开源的Java框架,旨在简化Java企业级应用的开发。Spring Framework是其核心部分,提供了依赖注入、面向切面编程和事务管理等功能。所以一般Spring框架指的是Spring Framework,广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。
Spring Framework主要功能模块
模块 | 功能描述 |
---|---|
核心容器 | 提供对象管理和依赖注入,支持Bean配置和生命周期管理。 |
AOP | 支持面向切面编程,允许将横切关注点(如日志、事务)与业务逻辑分离。 |
数据访问/集成 | 简化JDBC操作,支持ORM框架(如Hibernate),提供数据访问的统一方式。 |
Web模块 | 支持Spring MVC架构,创建Web应用程序,提供REST支持和文件上传功能。 |
安全模块 | 提供Spring Security,用于应用程序的身份验证和授权。 |
消息模块 | 提供对消息中间件(如JMS)的支持,支持异步处理。 |
声明式事务管理 | 通过注解或XML配置简化事务管理,允许在方法上声明事务属性,自动处理事务边界。 |
2、SpringIoC容器
-
在Spring框架中,组件是指由Spring容器管理的对象,通常被称为Bean。这些Bean可以是服务、控制器、数据访问对象等,Spring负责它们的创建、配置和生命周期管理。
-
组件管理是Spring的核心功能之一,主要通过IoC(控制反转) 实现。IoC容器负责管理对象的创建和它们之间的依赖关系,这使得应用程序的各个部分之间的耦合度降低,从而提高了可维护性和可测试性。
组件一定是对象,对象不一定是组件
-
组件是对象:
- 在Spring框架中,组件(通常称为Bean)是通过Spring IoC容器管理的对象。它们的创建、配置和生命周期管理都是由Spring负责。
-
对象不一定是组件:
- 在Java中,任何通过
new
关键字创建的实例都是对象,但这些对象并不一定由Spring容器管理。如果一个对象没有被Spring管理,就不能享受Spring提供的特性,比如依赖注入、生命周期管理等。
- 在Java中,任何通过
-
可复用的Java对象:
- 组件通常被设计为可以在不同的上下文中
重复使用
。因为它们遵循了良好的设计原则,比如单一职责原则和依赖注入,它们的逻辑可以在不同的场景中使用,而不需要进行大量修改。
- 组件通常被设计为可以在不同的上下文中
复杂容器概念引入
- 复杂容器指的是具有多个层次和功能的容器,能够管理和控制多个组件的生命周期、配置和交互。Tomcat不仅负责Servlet的执行,还处理了许多其他功能,如请求处理、线程管理、会话管理等。
- Spring IoC 容器,负责实例化、配置和组装 bean(组件)。容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。配置元数据以 XML、Java 注解或 Java 代码形式表现。它允许表达组成应用程序的组件以及这些组件之间丰富的相互依赖关系。
IoC容器接口介绍
Spring IoC容器主要通过两个接口来实现:BeanFactory和ApplicationContext。它们都负责管理Bean,但有一些关键的区别和扩展功能。
特性 | BeanFactory | ApplicationContext |
---|---|---|
定义 | Spring IoC容器的基本接口 | BeanFactory的子接口,提供更丰富的功能 |
实例化方式 | 延迟初始化,仅在需要时创建Bean | 预实例化,在启动时创建所有单例Bean |
国际化支持 | 无 | 支持多种语言和地区的国际化功能 |
事件传播 | 无 | 支持事件发布和监听机制,允许组件间的通信 |
AOP支持 | 无 | 提供面向切面编程的支持 |
适用场景 | 轻量级应用,资源使用要求较高的场景 | 复杂应用,特别是需要更多功能的企业级应用 |
ApplicationContext容器实现类
上下文类型 | 功能描述 | 加载方式说明 |
---|---|---|
ClassPathXmlApplicationContext | 从类路径加载XML配置文件,适用于在类路径下有配置文件的应用,通常用于标准的Java SE应用。 | 从classpath根目录加载配置文件,通常是项目的类路径下的resources |
FileSystemXmlApplicationContext | 从文件系统加载XML配置文件,适用于需要从任意路径加载配置文件的场景,能够处理绝对或相对路径。 | 直接从文件系统读取配置文件,可以使用绝对路径或相对路径。 |
AnnotationConfigApplicationContext | 以Java注解方式加载配置,适合使用注解定义Bean和依赖关系的应用,支持使用@Configuration 和@Component 注解。 | 通过扫描指定包或类,解析注解以注册Bean。 |
WebApplicationContext | 特殊类型的ApplicationContext,用于Web应用,提供额外的功能,如处理Web层的Bean、会话管理等,支持多种Web功能。 | 通常在Web应用中由ContextLoaderListener 或DispatcherServlet 加载,支持XML 和注解配置。 |
配置方式
Spring框架提供了多种配置方式:XML配置方式、注解方式和Java配置类方式
特点 | XML配置 | Java配置 | 注解配置 |
---|---|---|---|
配置形式 | 使用XML文件定义Bean | 使用带有@Configuration 注解的类定义Bean | 使用类上的注解(如@Component 等)自动扫描 |
类型安全 | 否 | 是 | 是 |
可读性 | 可读性一般,依赖于XML格式 | 可读性好,遵循Java语法 | 可读性好,直接在类上定义 |
灵活性 | 灵活,但修改后需重启应用 | 灵活,支持Java编程中的逻辑 | 灵活,支持灵活的包扫描 |
示例 | <bean id="myBean" class="com.example.MyClass"/> | @Bean public MyClass myBean() {...} | @Component public class MyClass {...} |
依赖注入方式 | 通过<property> 或<constructor-arg> 标签 | 通过方法参数和返回值 | 通过构造函数、字段或方法 |
启动方式 | 需要手动指定XML文件 | 通过Java类自动加载配置 | 通过@ComponentScan 自动扫描 |
容器、IoC、DI
3、SpringIoC实践与应用
实现步骤
- 配置元数据,此处以XML为例
-
Spring IoC 容器管理一个或多个组件。这些组件是使用你提供给容器的配置元数据(例如,以 XML
<bean/>
定义的形式)创建的。 -
<bean /> 标签 == 组件信息声明
-
id
属性是标识单个 Bean 定义的字符串。
-
class
属性定义 Bean 的类型并使用完全限定的类名。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 此处要添加一些约束,配置文件的标签并不是随意命名 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="..." [1] class="..." [2]>
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
- 实例化IoC容器
- 提供给
ApplicationContext
构造函数的位置路径是资源字符串地址,允许容器从各种外部资源(如本地文件系统、JavaCLASSPATH
等)加载配置元数据。 - 选择一个合适的容器实现类,进行IoC容器的实例化工作:此处以ClassPathXmlApplicationContext为例
//实例化ioc容器,读取外部配置文件,最终会在容器内进行ioc和di动作
ApplicationContext context =
new ClassPathXmlApplicationContext("services.xml", "daos.xml");
- 获取Bean(组件)
ApplicationContext
是一个高级工厂的接口,能够维护不同 bean 及其依赖项的注册表。通过使用方法T getBean(String name, Class<T> requiredType)
,可以检索 bean 的实例。允许读取 Bean 定义并访问它们,如以下示例所示:
//创建ioc容器对象,指定配置文件,ioc也开始实例组件对象
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//获取ioc容器的组件对象
PetStoreService service = context.getBean("petStore", PetStoreService.class);
//使用组件对象
List<String> userList = service.getUsernameList();