文章摘要: 基于Java实现MVC模型的轻量级Web框架。
注释
Spring框架设计思想
- 使用对象时不仅可以直接从IoC容器中获取bean对象,并且DI绑定好了所需的依赖关系。
- 通过xml配置文件的方式来降低耦合度。
- 通过注解的方式来减少配置文件中的数量。
简介
简要说明
- SpringFramework是一种基于Java实现MVC模型的轻量级Web框架。
- Spring 是一个轻量级Java开发框架。
- 目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。
- 核心特性:依赖注入(DI)、面向切片编程(AOP)。
- Spring是一个IOC(控制反转)和AOP(面向切片编程)的容器框架。容器用于管理应用对象的生命周期。
主要功能
- 更新Java版本支持:将支持Java 17或更高版本,利用最新的语言特性和改进。
- 模块化:进一步模块化框架,减少依赖,提高可维护性。
- 响应式编程:继续增强对响应式编程的支持,包括对Reactor和WebFlux的改进。
- Web应用开发:增强Spring MVC和Spring WebFlux,以支持现代Web应用的需求。
- 集成支持:改进对各种数据源、消息队列和第三方服务的集成。
- 云原生支持:更好地支持云原生应用开发,包括服务发现、配置管理、健康检查等。
- 性能优化:框架层面的性能优化,提高应用性能。
- 安全性增强:更新和改进Spring Security,以应对最新的安全威胁。
注意事项
- 兼容性:升级到Spring Framework 6可能需要修改现有代码,以适应新的API和更改。
- 依赖升级:依赖的第三方库可能需要升级以兼容Spring Framework 6。
- 学习曲线:开发者可能需要学习新的特性和最佳实践。
- 测试和验证:在迁移到新版本之前,应充分测试应用以确保稳定性。
适用场景
- 新项目开发:适用于开发新的Java企业级应用,特别是需要利用最新Java特性的项目。
- 云原生应用:适用于构建云原生应用,利用Spring Framework 6的云原生特性。
- 响应式系统:适用于构建响应式系统,如使用WebFlux的响应式Web应用。
- 微服务架构:适用于微服务架构,Spring Framework 6提供了更好的服务化和集成支持。
- 系统升级:适用于需要升级旧版Spring应用以利用新特性的项目。
Maven坐标
<dependency> <!-- Spring 框架的基础功能 -->
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.1.15</version> <!-- 请替换为实际的版本号 -->
</dependency>
核心概念
相关信息
控制反转IOC和Spring容器是一个东西
Spring容器
org.springframework.context.ApplicationContext是Spring容器实现的顶层接口,- 负责实例化、配置和关联Bean对象。
- 配置元数据可以使用XML、Java注解、Java配置类实现。
- 处理应用程序的对象与其他对象之间的相互依赖关系。
详细总结:Library-Maven-SpringFramework6-spring容器
Bean的生命周期步骤
详细总结:Library-Maven-SpringFramework6-Bean的生命周期
控制反转
- IoC(Inversion of Control)控制反转,对象的创建控制权由程序外部提供。
- SpringFramework 提供了一个容器,称为
IoC容器。- IoC容器负责对象的创建,初始化等一些列工作。
- IoC容器中被管理的对象被称为
Bean。
推断构造方法底层原理
依赖注入
- DI(Dependency Injection)依赖注入
- 对IoC容器中建立
Bean与Bean之间依赖关系的过程,被称为依赖注入。
初始化前、初始化、初始化后
AOP底层实现
事务及传播机制
Configuration注解底层原理
Spring6核心新特性介绍
配置属性
YAML配置文件
XML配置文件
详细总结:Library-Maven-SpringFramework6-配置文件-XML文件
注解
详细总结:Library-Maven-SpringFramework6-注解
方法
通过接口来自定义bean的特性
初始化回调函数
- 功能:允许bean在所有的必要的依赖配置完成后执行bean的初始化。在实例化bean之前执行该方法。
- 继承
org.springframework.beans.factory.InitializingBean接口。- 重写
afterPropertiesSet()方法。
销毁回调函数
- 功能:Bean能让容器通过回调来销毁bean所引用的资源。在销毁bean之后执行该方法。
- 实现
org.springframework.beans.factory.DisposableBean 接口接口。- 重写
destroy()方法。
获取Spring的IoC容器
实例化IoC容器对象,并加载所有bean到容器中
ApplicationContext,spring的顶层核心接口,一般用于当作数据类型(数据类型向上转型)
方法名
new ClassPathXmlApplicationContext(),根据项目路径的xml配置文件,来实例化spring容器new FileSystemXmlApplicationContext(),根据磁盘路径的xml配置,来实例化spring容器new AnnotationConfigApplicationContext(),根据java配置类,来实例化spring容器
案例
// 实例化IoC容器对象,并加载所有bean到容器中
ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc.xml");
获取IoC容器中的bean对象
案例
// 获取bean对象
// 写法一,通过“class”在IoC容器中查找
User bean = ioc.getBean(User.class);
// 写法二,通过“id或name”在IoC容器中查找
User bean = (User)ioc.getBean("user");
// 写法三,通过“id或class”在IoC容器中查找
User bean = ioc.getBean("user", User.class);
表达式
${<bean对象>}:花括号{}里面写注册(添加)到IoC容器中的对象,例如:project.name来获取对象的name属性。#():
IoC容器的配置方案
基于XML文件
- 定义XML配置文件、声明Bean信息,交给
配置spring的IoC容器的xml配置文件
<?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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--添加bean对象-->
<bean id="bookDao" name="book bookDaoImap" class="com.cykj.dao.impl.BookDaoImpl">
</bean>
<!--添加bean对象-->
<bean id="bookService" class="com.cykj.service.impl.BookServiceImpl">
<!--依赖注入,将另一个bean当作参数进行注入-->
<property name="bookDao" ref="bookDao"></property>
</bean>
</beans>
基于注解
- 基于注解的元数据配置。
- SSM框架开发中使用。(当需要与其他插件相互操作时使用)
- 在运行时IoC容器将扫描指定包路径下有包含
@Component、@Controller、@Service、@Repository注解的类,并添加到IoC容器中。
配置spring的IoC容器的xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!--添加命名空间-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--指定包扫描路径,通过查找注解的方式来确定bean对象,并添加到IoC容器中进行管理-->
<!--通过指定扫描路径,用于告知spring的扫描位置-->
<context:component-scan base-package="<需要扫描的包路径>"></context:component-scan>
</beans>
将需要被添加到IoC容器的类上添加注解
// 标记为bean对象
@Service("userService")
public class UserServiceImpl {
private UserDaoImpl userDao;
// 依赖注入,查询IoC容器中的bean对象,并将满足条件的对象当作参数传入
@Autowired
public UserServiceImpl( UserDaoImpl userDao) {
this.userDao = userDao;
}
// 提供get/set方法,暴露出去可供外部使用
public UserDaoImpl getUserDao() {
return userDao;
}
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
}
基于Java配置类
- 使用Java配置来代替XML配置。
创建IoC容器和添加bean的方式
配置文件中添加
- 在配置文件中手动编写需要由IoC容器管理的bean,并关联所需的依赖。
IoC容器层面
- 创建spring的xml文件,并手动添加需要被IoC容器管理的对象。
- 格式如下:
<!--添加service、dao到IoC容器中,以Bean对象的形式存在-->
<bean class="com.cykj.service.UserService">
<!--依赖注入,为bean关联好所依赖的bean对象-->
<!--将当前bean中的方法与bean对象进行关联-->
<property name="userDao" ref="userDao"></property>
</bean>
<bean name="userDao" class="com.cykj.dao.UserDao"></bean>
...
...
...
servlet层面
- 在
servlet层中的代码,获取spring的IoC容器,并从中获取service。- 添加如下代码:
// 依赖spring的IoC容器,即spring配置文件
// 从IoC容器中获取service,即从spring配置文件中获取service
// 获取spring的IoC容器
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("spring.xml");
// 从IoC容器中获取service
IUserService service = ioc.getBean(IUserService.class);
// 执行service
service.getUser();
service层面
- 此处所需要执行的dao层无需被赋值。
- 提供修改变量的get/set方法,用于让IoC容器能够赋值具体的内容在里面。
public class UserService implements IUserService {
// 依赖spring注入(DI)
IUserDao userDao; // 此处无需赋值
public void getUser() {
userDao.getUser();
}
public IUserDao getUserDao() {
return userDao;
}
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
}
dao层面
- 无需任何变动。
public class UserDao implements IUserDao {
@Override
public void getUser() {
System.out.println("具体查询数据库的代码,查询用户");
}
}
扫描注解
- 在运行时IoC容器将扫描指定包路径下有包含
@Component注解的类,并添加到IoC容器中。
IoC容器层面
- 创建spring的xml文件,指定扫描路径。
- 格式如下:
<!--指定包扫描路径,通过查找注解的方式来确定bean对象,并添加到IoC容器中进行管理-->
<!--通过指定扫描路径,用于减少对不必要的类进行扫描-->
<context:component-scan base-package="com.cykj" />
servlet层面
- 在
servlet层中的代码,获取spring的IoC容器的xml配置文件,并从中获取service。- 添加如下代码:
import org.springframework.context.support.ClassPathXmlApplicationContext;
// 依赖spring的IoC容器,即spring配置文件
// 从IoC容器中获取service,即从spring配置文件中获取service
// 获取spring的IoC容器
ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("spring.xml");
// 从IoC容器中获取service
IUserService service = ioc.getBean(IUserService.class);
// 执行service
service.getUser();
service层面
- 在类的头部添加
@Component注解,IoC容器会在扫描到后,将该类添加到容器中并实例化。- 在依赖dao层的代码的地方,头部添加
@Autowired注解,IoC容器将会自动进行依赖绑定,将dao层的实现对象赋值给变量。
@Component // spring的IoC容器扫描的注解,将被添加到IoC容器中
public class UserService implements IUserService {
// 依赖spring注入(DI)
@Autowired // spring的依赖绑定的注解
IUserDao userDao; // 此处无需赋值
@Override
public void getUser() {
userDao.getUser();
}
public IUserDao getUserDao() {
return userDao;
}
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
}
dao层面
- 在类的头部添加
@Component注解,IoC容器会在扫描到后,将该类添加到容器中并实例化。
import org.springframework.stereotype.Component;
@Component // spring的IoC容器扫描的注解,将被添加到IoC容器中
public class UserDao implements IUserDao {
@Override
public void getUser() {
System.out.println("具体查询数据库的代码,查询用户");
}
}
Java配置类
- 编写Java配置类,该类添加
@Configuration和@ComponentScan(<包扫描路径>)注解,并添加bean。
IoC容器层面
- 创建java代码,文件例如:
SpringConfig.java- 并添加如下内容:
@Configuration // 标记为是spring的xml配置文件
@ComponentScan("com.cykj") // 指定包扫描路径,通过查找注解的方式来确定bean对象,并添加到IoC容器中进行管理
public class SpringConfig {
}
servlet层面
- 在
servlet层中的代码,获取IoC容器的Java配置类,并从中获取service。- 添加如下代码:
// 获取IoC容器的Java配置类
AnnotationConfigApplicationContext ioc = new AnnotationConfigApplicationContext(SpringConfig.class);
// 从IoC容器中获取service
IUserService service = ioc.getBean(IUserService.class);
// 执行service
service.getUser();
service层面
- 在类的头部添加
@Component注解,IoC容器会在扫描到后,将该类添加到容器中并实例化。- 在依赖dao层的代码的地方,头部添加
@Autowired注解,IoC容器将会自动进行依赖绑定,将dao层的实现对象赋值给变量。
@Component // spring的IoC容器扫描的注解,将被添加到IoC容器中
public class UserService implements IUserService {
// 依赖spring注入(DI)
@Autowired // spring的依赖绑定的注解
IUserDao userDao; // 此处无需赋值
@Override
public void getUser() {
userDao.getUser();
}
public IUserDao getUserDao() {
return userDao;
}
public void setUserDao(IUserDao userDao) {
this.userDao = userDao;
}
}
dao层面
- 在类的头部添加
@Component注解,IoC容器会在扫描到后,将该类添加到容器中并实例化。
import org.springframework.stereotype.Component;
@Component // spring的IoC容器扫描的注解,将被添加到IoC容器中
public class UserDao implements IUserDao {
@Override
public void getUser() {
System.out.println("具体查询数据库的代码,查询用户");
}
}
配置静态资源路径映射
- 作用:当web服务器的
DispatcherServlet拦截到url时判断是否是静态资源,并返回静态资源。
<!--配置静态资源路径映射-->
<mvc:annotation-driven/>
<!--将拦截到的url,满足该条件的url,映射到指定本地路径,并返回静态资源-->
<!-- - mapping:设置URL上的路径,从“请求资源路径”的根路径开始,`**`代表全部资源-->
<!-- - location:设置项目本地下的目录位置,`webapp/`是本地静态资源根路径-->
<mvc:resources mapping="/static/**" location="/static/"/>