Spring MVC的工作流程
Spring MVC的工作流程:
1、用户发送请求给前端控制器(DispatcherServlet)
2、前端控制器接收请求后给处理器映射器(HandlerMapping),来知道该请求由哪个Controller来处理
3、前端控制器调用处理器适配器(HandlerAdapter),去告诉处理器适配器应该执行哪个Controller
4、处理器适配器(HandlerAdapter)执行Controller并得到ModelAndView(数据和视图),并层层返回给前端控制器。
提示:Model(模型数据,即Controller处理的结果,Map) View(逻辑视图名,即负责展示结果的JSP页面 的名字)
5、前端控制器将执行的结果(ModelAndView)交给视图解析器(ViewReslover)解析,然后返回真正的视图。
6、前端控制器根据Model对View进行渲染(即将模型数据填充进视图中)
7、前端控制器将结果响应给用户
Spring MVC的工作原理:
一个http请求被截获后,前端控制器会通过处理器映射器定位到特定的Handler(后面编程时用Controller),然后通过处理器适配器调用Controller的业务处理方法后,返回一个Model and view(模型数据和逻辑视图),交给前端控制器。前端控制器再调用视图解析器解析出真实的视图对象,得到这个视图对象后,再使用Model对其进行渲染,最终把结果返回给用户。
servlet的工作流程:
- 客户端发送请求
- Web服务器接收请求
- 加载servlet类
- 创建请求和响应对象
- 调用servlet的service()方法
- 处理请求
- 生成响应
- 发送响应
- 销毁servlet实例
servlet的生命周期
Servlet 的生命周期包括以下三个阶段:
初始化(Initialization):
在 Servlet 被容器加载时,会调用其 init() 方法来进行初始化操作。
init() 方法只会在 Servlet 的生命周期中被调用一次。服务(Service):
在初始化完成后,Servlet 将进入服务阶段,处理客户端请求。
对于每个请求,Servlet 容器将调用 service() 方法来处理请求,并将请求和响应对象作为参数传递给该方法。
service() 方法根据请求类型(GET、POST 等)调用相应的 doGet()、doPost() 等方法来处理具体的业务逻辑。
在这个阶段,Servlet 可以多次被调用来处理不同的请求。销毁(Destroy):
当 Servlet 容器决定卸载或重新加载 Servlet 时,会调用其 destroy() 方法来进行清理操作。
destroy() 方法只会在 Servlet 的生命周期结束时被调用一次。
在该阶段,可以释放资源、关闭数据库连接等清理工作。需要注意的是,Servlet 在第一次被请求时会被初始化,然后在多次请求中被服务,最后在容器关闭时被销毁。Servlet 的生命周期由 Servlet 容器(如 Tomcat)来管理和控制,开发人员只需实现相应的回调方法即可。
JavaBean
JavaBean是一些可移植、可重用的Java实体类,它们可以组装到应用程序中。
JavaBean和使用class定义的一般类有所区别,其定义如下:
- JavaBean(类)需打包存放,并声明为public类型;
- 类的访问属性声明为private类型;
- 具有无参数、public类型的构造方法;
- 如果属性(成员变量)的名字是xxxx,则相应地有用来设置(setter)属性和获得(getter)属性的两个方法。一个JavaBean通常包含若干属性,包含一个属性的JavaBean定义如下:
ORM概述
ORM对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。ORM框架是连接数据库的桥梁,只要提供了持久化类与表的映射关系,ORM框架在运行时就能参照映射文件的信息,把对象持久化到数据库中。
简而言之就是ORM可以将某个数据库的映射成一个java对象,比如把MySQL的一张表映射成java类,然后表里面的字段就是这个类的成员变量,然后我们就可以通过调用类生成表对象来操纵数据库并且类中封装了SQL语句可以直接调用相关封装的函数,不用手写SQL查询。
MyBatis
MyBatis 是一个优秀的持久层框架,它通过简单的 XML 或注解来配置和映射,避免了几乎所有的 JDBC 代码以及手动设置参数和获取结果集。
MyBaits是一个轻量级的ORM框架,实现了Java对象和表之间的映射,使Java程序员可以使用 面向对象编程思维来操纵数据库,很好地解决了记录输出的问题。
使用MyBaits的基本步骤是:加载框架配置文件,创建数据库会话工厂对象,创建数据库会话对象,直接使用SqlSession提供的CRUD方法(这里CRUD就是增删改查的缩写),或者通过Mapper对象调用映射接口所定义的方法。
以下是 MyBatis 的基本使用方法:
1. 引入依赖
首先,在你的项目中引入 MyBatis 和数据库驱动的依赖。以 Maven 项目为例,你可以在 pom.xml 中添加以下依赖:
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.26</version>
</dependency>
</dependencies>
2. 配置 MyBatis
创建 MyBatis 的主配置文件 mybatis-config.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/yourdatabase"/>
<property name="username" value="yourusername"/>
<property name="password" value="yourpassword"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="path/to/YourMapper.xml"/>
</mappers>
</configuration>
3. 创建实体类
创建与数据库表对应的实体类:
public class User {
private int id;
private String username;
private String password;
// getters and setters
}
4. 创建 Mapper 接口
定义操作数据库的 Mapper 接口:
public interface UserMapper {
User selectUser(int id);
void insertUser(User user);
void updateUser(User user);
void deleteUser(int id);
}
5. 创建 Mapper XML 文件
在 mybatis-config.xml 中指定的路径下创建 Mapper XML 文件 YourMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yourpackage.UserMapper">
<select id="selectUser" parameterType="int" resultType="User">
SELECT * FROM users WHERE id = #{id}
</select>
<insert id="insertUser" parameterType="User">
INSERT INTO users (username, password) VALUES (#{username}, #{password})
</insert>
<update id="updateUser" parameterType="User">
UPDATE users SET username = #{username}, password = #{password} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM users WHERE id = #{id}
</delete>
</mapper>
6. 使用 MyBatis
创建 MyBatis SqlSession 工厂并使用 Mapper 执行操作:
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.Reader;
public class Main {
public static void main(String[] args) {
String resource = "mybatis-config.xml";
try (Reader reader = Resources.getResourceAsReader(resource)) {
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
try (SqlSession session = sqlSessionFactory.openSession()) {
UserMapper mapper = session.getMapper(UserMapper.class);
// Select a user
User user = mapper.selectUser(1);
System.out.println(user);
// Insert a user
User newUser = new User();
newUser.setUsername("newuser");
newUser.setPassword("password");
mapper.insertUser(newUser);
session.commit();
// Update a user
user.setUsername("updateduser");
mapper.updateUser(user);
session.commit();
// Delete a user
mapper.deleteUser(user.getId());
session.commit();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
在你提供的配置文件中,
ref
和value
是 Spring 配置文件中常用的两个属性,用于注入依赖和设置属性值。
ref 属性:
- 在
<property>
元素中,ref
属性通常用于注入一个 Spring 容器中已经定义的 Bean 实例。- 例如,在配置
<property name="dataSource" ref="dataSource" />
中,ref="dataSource"
表示将名为dataSource
的 Bean 注入到当前的属性中。- 这种方式利用了 Spring IoC 容器的特性,即通过名称(或者类型)来定位并注入依赖对象,从而实现了对象之间的解耦合。
ref
用于将一个 Bean 注入到另一个 Bean 的属性中,通常用于依赖注入。value 属性:
value
属性用于设置一个普通的属性值,通常是基本类型值或者字符串。ref
用于将一个 Bean 注入到另一个 Bean 的属性中,通常用于依赖注入。- 在
<property>
元素中,例如<property name="driverClassName" value="${jdbc.driver}" />
,${jdbc.driver}
是一个属性占位符,表示该属性值从 Spring 的属性文件中动态获取。- Spring 允许在配置文件中定义这些占位符,然后通过配置文件或者其他外部配置源(如属性文件)来为这些占位符提供具体的值。
具体解释:
dataSource Bean 的配置——配置数据源 (
dataSource
):<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean>
id="dataSource"
: 定义一个名为dataSource
的 Bean,用于连接数据库的数据源。class="org.apache.commons.dbcp.BasicDataSource"
: 指定数据源的实现类为 Apache Commons DBCP 的BasicDataSource
,用于管理数据库连接池。属性设置部分:
driverClassName
,url
,username
,password
: 这些是通过 Spring 的属性占位符${...}
来动态设置的数据库连接信息,从外部配置文件中读取。比如${jdbc.driver}
将会替换为配置文件中定义的 JDBC 驱动类名、数据库 URL、用户名和密码。destroy-method="close"
: 指定在 Spring 容器关闭时调用close
方法来释放资源。ref="dataSource"
:sqlSession
Bean 中的<property name="dataSource" ref="dataSource" />
表示将名为dataSource
的 Bean(即上面定义的BasicDataSource
)注入到sqlSession
的dataSource
属性中。${jdbc.driver}
,${jdbc.url}
,${jdbc.username}
,${jdbc.password}
:这些是属性占位符,表示从外部配置文件(如application.properties
)中读取对应的 JDBC 驱动类名、数据库 URL、用户名和密码。sqlSession Bean 的配置——配置数据库会话工厂 (
sqlSession
):<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="typeAliasesPackage" value="com.memmana.entity"/> <!-- 其他配置 --> </bean>
id="sqlSession"
: 定义了一个名为sqlSession
的 Bean,这是 MyBatis 的SqlSessionFactoryBean
,用于创建 MyBatis 的 SqlSessionFactory。dataSource
属性:指定该 SqlSessionFactory 使用的数据源,这里引用了前面配置的dataSource
Bean。typeAliasesPackage
属性:指定 MyBatis 映射文件中实体类的包名,使得 MyBatis 可以扫描该包下的实体类并注册别名,简化映射文件中的配置ref="dataSource"
:将名为dataSource
的 Bean 注入到sqlSession
的dataSource
属性中,用于 MyBatis 的 SqlSessionFactory 配置。value="com.memmana.entity"
:设置typeAliasesPackage
属性为com.memmana.entity
,表示 MyBatis 将扫描该包下的实体类,以便在映射文件中使用别名来引用这些实体类。MapperScannerConfigurer 的配置——配置映射器扫描 (
MapperScannerConfigurer
):<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.memmana.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSession"/> </bean>
class="org.mybatis.spring.mapper.MapperScannerConfigurer"
: 这个 Bean 是用来扫描 MyBatis 映射器接口的配置。basePackage
属性:指定扫描映射器接口的包路径,即com.memmana.mapper
,Spring 会自动扫描该包及其子包下的接口。sqlSessionFactoryBeanName
属性:指定要使用的 SqlSessionFactory Bean 的名称,这里是sqlSession
,表示映射器接口将会使用该 SqlSessionFactory 进行数据库操作。value="com.memmana.mapper"
:设置basePackage
属性为com.memmana.mapper
,表示 MapperScannerConfigurer 将扫描该包及其子包下的接口。value="sqlSession"
:设置sqlSessionFactoryBeanName
属性为sqlSession
,表示在创建 DAO 对象时,使用名为sqlSession
的 SqlSessionFactory Bean 进行数据库会话管理。总结来说,
ref
属性用于注入 Bean 实例,而value
属性用于设置普通的属性值或者从外部配置文件中获取值。这些属性的使用使得 Spring 的配置文件能够灵活地管理和组装各个组件之间的依赖关系和配置信息。
spring
spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。
spring是一个大容器。
spring框架能消除对象之间的强耦合。
spring将创建被调用者不再由调用者完成而是由spring容器完成的方式称为依赖注入(DI)或控制反转(IOC)。
控制反转和依赖注入本质是使用JAVA反射技术实现的。
spring将在Java应用中各实例之间的调用关系成为依赖。
IOC(控制反转)和DI(依赖注入)的关系和区别?
IOC是一种设计原则,而DI是IOC的一种实现方式。
它们是对同一件事情的不同描述。
IoC强调的是将对象实例的创建控制权由spring容器来统一管理,需要的时候从容器中取出,而不是由调用者自身去创建,从而达到降低代码耦合性与硬代码的目的。
依赖注入强调的是当调用者需要使用对象实例时,spring容器为调用者提供对象实例这个过程。
两者共同工作,使得应用程序的代码更加解耦和可维护。可以有效地降低代码之间的耦合度,提高系统的可扩展性和可维护性。
DI 的主要形式包括:
1、构造函数注入:通过对象的构造函数传递依赖。
public class Service { private final Repository repository; public Service(Repository repository) { this.repository = repository; } }
2、Setter 方法注入:通过 setter 方法传递依赖。
public class Service { private Repository repository; public void setRepository(Repository repository) { this.repository = repository; } }
在敲代码之前我需要了解几个Spring中常见的注解:
@Conponent:标注任意类为Bean;
@Repository:定义数据访问层Bean的注解;
@Service:定义业务层Bean的注解;
@Controller:定义控制器层Bean的注解;
@Autowired:用于依赖注入,是替代配置文件中的ref属性。
注意:使用@Conponent、@Repository、@Service、@Controller注解时需要配合配置文件中的<context:component-scan>标签。
AOP
AOP(面向切面编程) :将业务逻辑从应用服务中分离出来,实现了高内聚开发,应用对象只关注业务逻辑,不再负责其他系统问题。
AOP 的核心概念
切面(Aspect): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。公共的方法。它封装了特定的功能,比如日志记录或事务管理。
连接点(Join Point):连接点是在程序执行过程中能够插入切面的具体位置,比如方法调用或异常抛出。表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
切入点(Pointcut):切入点是一个表达式,用于匹配连接点。切入点定义了切面应该在何处应用。将方法注入到接口调用的某个地方(切点)。它定义了相应的 Advice 将要发生的地方。
通知(Advice)(增强):通知是切面在特定连接点执行的代码。Advice 定义了在
Pointcut
里面定义的程序点具体要做的操作根据执行时机,通知可以分为前置通知、后置通知、环绕通知、异常通知和最终通知。织入(Weaving):织入是将切面应用到目标对象以创建代理对象的过程。织入可以在编译时、类加载时或运行时进行。
ssm与springboot整合的区别
ssm=spring+spring mvc+mybatis,需要手动配置xml和注解,项目结构复杂
spring boot不是一个全新的框架,而是一个集成框架,集成了所有框架。提供了自动配置,大大简化配置过程,项目结构简单,遵循“约定优先于配置”。