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反转控制
87 0
|
XML 设计模式 安全
Spring的反转控制你真的明白了吗?(上)
Spring的反转控制你真的明白了吗?
|
2月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
1月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
161 2
|
3月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
6天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
18 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
2天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
11 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
52 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
4月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
1月前
|
XML Java 应用服务中间件
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错
157 2