Spring的反转控制你真的明白了吗?(下)

简介: Spring的反转控制你真的明白了吗?

MVC(模型-视图-控制器)


Spring 提供了一个基于 MVC 模式的 Web 开发框架,它支持多种视图技术,比如 JSP、Freemarker 等。Spring MVC 可以很好地与其他 Spring 组件集成,比如 IoC 和 AOP。

MVC(模型-视图-控制器)是一种常见的软件架构模式,它将应用程序分为三个部分:模型、视图和控制器。Spring MVC 是一个基于 MVC 模式的 Web 框架,它使用了这种模式来组织代码和功能。


下面是对 Spring MVC 的三个核心概念进行详细的解释,并给出相应的 Java 代码示例:


模型(Model):


模型表示应用程序中的数据和业务逻辑。在 Spring MVC 中,模型通常由 POJO(普通 Java 对象)组成,这些对象负责管理应用程序的状态和行为。以下是一个简单的模型类示例:

public class User {
    private int id;
    private String name;
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }
    // 省略 getter 和 setter 方法
}


视图(View):


视图负责渲染模型数据并生成 HTML 输出,以便用户可以看到和交互。在 Spring MVC 中,视图通常是 JSP、Freemarker 或 Thymeleaf 文件。以下是一个简单的 JSP 视图示例:

<html>
<head><title>User Profile</title></head>
<body>
    <h1>User Profile:</h1>
    <h2>ID: ${user.id}</h2>
    <h2>Name: ${user.name}</h2>
</body>
</html>


控制器(Controller):


控制器处理客户端请求并返回响应。在 Spring MVC 中,控制器通常是一个带有 @Controller 注解的类,它负责将请求映射到适当的处理方法上,并将模型数据传递给视图。以下是一个简单的控制器示例:

@Controller
public class UserController {
    @RequestMapping("/user/{id}")
    public ModelAndView userProfile(@PathVariable("id") int id) {
        User user = getUserById(id);
        ModelAndView mav = new ModelAndView("user-profile");
        mav.addObject("user", user);
        return mav;
    }
    private User getUserById(int id) {
        // 从数据库或其他数据源中获取用户数据
        User user = new User(id, "John Doe");
        return user;
    }
}


在上面的示例中,@Controller 注解告诉 Spring 这是一个控制器类。@RequestMapping 注解指定了处理 “/user/{id}” URL 的方法。方法中使用 @PathVariable 注解将 URL 中的占位符绑定到方法参数中。getUserById 方法从数据库或其他数据源中获取用户数据,并返回一个 User 对象。最后,方法创建一个 ModelAndView 对象并将模型数据添加到该对象中,然后将其返回。


JDBC Template


JDBC Template 是 Spring 框架中的一个重要组件,它封装了 JDBC 操作,简化了数据库访问的过程,并提供了一些常见的操作方法,比如查询、更新、批量操作等。

JDBC Template 是 Spring 框架中的一个核心组件,它提供了一种简化 JDBC 操作的方式。JDBC Template 封装了常见的 JDBC 操作,使得数据库访问变得更加简单和安全。


下面是对 JDBC Template 的核心概念进行详细的解释,并给出相应的 Java 代码示例:


1. 数据源(DataSource)


数据源是 JDBC Template 连接数据库的重要配置。在 Spring 中,数据源通常由 JNDI、Spring Bean 或其他方式定义。以下是一个简单的数据源配置示例:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
    <property name="username" value="root"/>
    <property name="password" value="password"/>
</bean>


2. JDBC Template


JDBC Template 是 Spring JDBC 的核心组件之一。它封装了常见的 JDBC 操作,如查询、更新和批处理等。以下是一个简单的 JDBC Template 配置示例:

@Autowired
private JdbcTemplate jdbcTemplate;
public void addUser(User user) {
    String sql = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)";
    Object[] params = {user.getId(), user.getName(), user.getAge()};
    jdbcTemplate.update(sql, params);
}


在上面的示例中,我们注入了一个 JdbcTemplate 对象,并使用它执行 SQL INSERT 操作。update 方法接受两个参数:SQL 语句和参数数组。它将 SQL 语句和参数传递给数据库,并返回受影响的行数。


3. 数据访问对象(DAO)


数据访问对象是一种设计模式,它封装了对数据库的访问,并提供了一些常见的操作方法。在 Spring 中,我们可以使用 JDBC Template 来实现 DAO。以下是一个简单的 DAO 示例:

@Repository
public class UserDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;
    public List<User> getAllUsers() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new UserRowMapper());
    }
    private static final class UserRowMapper implements RowMapper<User> {
        public User mapRow(ResultSet rs, int rowNum) throws SQLException {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            int age = rs.getInt("age");
            return new User(id, name, age);
        }
    }
}


在上面的示例中,我们定义了一个 UserDao 类,并注入了一个 JdbcTemplate 对象。getAllUsers 方法使用 query 方法执行 SQL SELECT 操作,并使用 UserRowMapper 对象将结果集映射为 User 对象列表。


以上就是 JDBC Template 的核心概念及相应的 Java 代码示例。JDBC Template 可以大大简化数据库访问的过程,使得开发人员能够更加专注于业务逻辑的实现。


Transaction Management(事务管理)


Spring 提供了多种事务管理方式,支持编程式和声明式两种方式。通过 Spring 的事务管理机制,我们可以很方便地实现数据的一致性和完整性。


事务管理是任何应用程序中必不可少的一部分,它确保应用程序对数据库的操作是原子性、一致性、隔离性和持久性。Spring 提供了多种事务管理方式,并支持编程式和声明式两种方式。


下面是对 Spring 事务管理的核心概念进行详细的解释,并给出相应的 Java 代码示例:


1. 事务(Transaction)


事务是一组相关的操作,它们在一个逻辑单元内执行,并且要么全部成功完成,要么全部回滚。在 Spring 中,事务通常由 @Transactional 注解定义。以下是一个简单的事务定义示例:

@Transactional
public void transferMoney(Account from, Account to, double amount) {
    // 执行转账操作
}


在上面的示例中,@Transactional 注解告诉 Spring 这是一个事务方法。如果该方法成功完成,则所有操作将被提交;否则,所有操作将被回滚。


2. 事务管理器(Transaction Manager)


事务管理器负责协调和管理事务。在 Spring 中,我们可以使用 JdbcTemplate 或 Hibernate 等数据访问技术来执行事务,同时也可以使用 Spring 的事务管理器来控制事务的边界。以下是一个简单的事务管理器配置示例:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>


3. 编程式事务管理


编程式事务管理通常意味着手动管理事务。在 Spring 中,我们可以使用 TransactionTemplate 对象来完成编程式事务管理。以下是一个简单的编程式事务管理示例:

@Autowired
private DataSource dataSource;
public void transferMoney(Account from, Account to, double amount) {
    TransactionTemplate transactionTemplate = new TransactionTemplate();
    transactionTemplate.setTransactionManager(new DataSourceTransactionManager(dataSource));
    transactionTemplate.execute(status -> {
        // 执行转账操作
        return null;
    });
}


在上面的示例中,我们使用 TransactionTemplate 对象来执行转账操作,并将其包装在一个 Lambda 表达式中。execute 方法接受一个 Lambda 表达式,该表达式包含要在事务内执行的代码。


4. 声明式事务管理


声明式事务管理通常意味着使用 AOP 技术来自动管理事务。在 Spring 中,我们可以使用 @Transactional 注解来定义声明式事务。以下是一个简单的声明式事务管理示例:

@Transactional
public void transferMoney(Account from, Account to, double amount) {
    // 执行转账操作
}


在上面的示例中,@Transactional 注解告诉 Spring 这是一个事务方法。如果该方法成功完成,则所有操作将被提交;否则,所有操作将被回滚。


以上就是 Spring 事务管理的核心概念及相应的 Java 代码示例。通过 Spring 的事务管理机制,我们可以很方便地实现数据的一致性和完整性,从而确保应用程序的正确性和可靠性。

相关文章
|
XML Java 数据格式
一文讲透Spring的IOC反转控制
一文讲透Spring的IOC反转控制
96 0
|
XML 设计模式 安全
Spring的反转控制你真的明白了吗?(上)
Spring的反转控制你真的明白了吗?
|
29天前
|
XML Java 应用服务中间件
Spring Boot 两种部署到服务器的方式
本文介绍了Spring Boot项目的两种部署方式:jar包和war包。Jar包方式使用内置Tomcat,只需配置JDK 1.8及以上环境,通过`nohup java -jar`命令后台运行,并开放服务器端口即可访问。War包则需将项目打包后放入外部Tomcat的webapps目录,修改启动类继承`SpringBootServletInitializer`并调整pom.xml中的打包类型为war,最后启动Tomcat访问应用。两者各有优劣,jar包更简单便捷,而war包适合传统部署场景。需要注意的是,war包部署时,内置Tomcat的端口配置不会生效。
233 17
Spring Boot 两种部署到服务器的方式
|
29天前
|
Dart 前端开发 JavaScript
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
61 17
springboot自动配置原理
|
1月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
87 11
|
1月前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
369 12
|
1月前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
47 10
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
84 8
|
2月前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
2月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
153 14