【框架】[Spring] 基于Spring框架的Web应用演示(附带cglib工具进行动态代理)(1)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 【框架】[Spring] 基于Spring框架的Web应用演示(附带cglib工具进行动态代理)

前言:

Spring也差不多学了Ioc控制反转和实现AOP技术的两种方式了,分享一个学习Spring,用来入门挺好的例子。

如果你是刚刚学习Spring,那么此实例应该可以很好的帮助你应用Spring到Web项目中。

里面的DAO层-提交数据库的事务我并没有使用Spring 的注解功能,而是用spring的AOP来实现的。这样更灵活,其实,框架为我们做的事越多,我们就越受框架的约束。想把功能做灵活,就越难实现。

只要我们把底层学好,框架的功能我们都能自己写出来的,而且自己写出来的东西,肯定会更熟悉。

框架是为了降低程序之间的依赖性和耦合性,使重用性达到最高。

学习框架,我更多的希望自己能学会框架的思想,理解为什么!

首先准备数据库:

create database mydb charset=utf8;
create table stud(
  s_id varchar(32) primary key,
  s_name varchar(40)
);
create table book(
  b_id int primary key  auto_increment,
  b_name varchar(40)
);

准备好这2个表:

image.png

Jar包少不了:

image.png

相信学到这一步的朋友应该有了自己的一个配套包了吧,在这里我就不去一 一将包链接写出了。

如果需要这些包的,在本博客最后我会给出整个项目的链接,请到里面的WEB-INF/lib目录下去下载。

配好web.xml:

配置web.xml-以使用Spring。

<context-param>
        <!-- param的name必须为contextConfigLocation,Spring内部会解析的 -->
        <param-name>contextConfigLocation</param-name>
        <!-- contextConfigLocation参数的值,课配置多个,用英文逗号隔开 -->
        <param-value>
            classpath:beans.xml,
            /WEB-INF/conf/applicationContext.xml
        </param-value>
  </context-param>
  <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

org.springframework.web.context.ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息。因为它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行Spring实现的方法。

小知识点:

容器对于web.xml的加载过程是context-param >> listener >> fileter >> servlet.

接下来就是写:

classpath:beans.xml和/WEB-INF/conf/applicationContext.xml这2个xml。

classpath:代表beans.xml的位置在src(bin)目录下。

既然需要连接数据库,我们还需要一个配置文件jdbc.properties,声明一些数据库的协议(其实可以在applicationContext.xml中直接配置的,可以不用这个文件)

jdbc.properties:

image.png

#如果是utf-8编码,第一行必须空一行.因为utf-8的文件开头有一个符号
#在本例中,我用这个配置文件会出现账号密码错误,无法连接数据库,原因未知
#所以,我在本例是直接配置dataSource的,未用到本文件
#数据库驱动包
driver=com.mysql.jdbc.Driver
#连接数据库的协议--三个"/"代表通过数据库默认端口连接本机的数据库,也可以写成//localhost:3306/
url=jdbc:mysql:///mydb?characterEncoding=utf-8
username=root
pwd=1234
#其实前面的4个变量名都是自己随便可以取的,因为真正的读取不是在这里
#真正的读取在applicationContext.xml中

在applicationContext.xml配置如下就可以拿到数据库连接了。

<!-- 使用jdbc.properties配置文件,就要写下面这句 -->
<!--    <context:property-placeholder location="WEB-INF/conf/jdbc.properties"/> -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <!-- 使用jdbc.properties配置文件,类似如下配置 -->
<!--        <property name="driverClass" value="${driver}"></property> -->
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property> 
        <property name="url" value="jdbc:mysql:///mydb?characterEncoding=UTF-8"></property> 
        <property name="username" value="root"></property> 
        <property name="password" value="1234"></property> 
    </bean>

beans.xml

写好DAO,service,servlet层的架构-方法和变量:

在beans.xml中配置好DAO,service的初始化bean,初始化属性。

而由于我们在web.xml配置了servlet,是Tomcat帮我们new-servlet的,所以,但是我们需要在servlet中需要访问service的对象,这个时候,我们就可以利用servlet的生命周期,在init方法中,给service对象赋值.

<?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"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
    <bean id="studDao" class="cn.hncu.stud.dao.StudDaoJdbc">
       <!--ref="dataSource",引用applicationContext.xml中的dataSource  -->
       <property name="dataSource" ref="dataSource"></property>
    </bean>
    <bean id="bookDao" class="cn.hncu.stud.dao.BookDaoJdbc">
       <!--ref="dataSource",引用applicationContext.xml中的dataSource  -->
       <property name="dataSource" ref="dataSource"></property>
    </bean>
    <bean id="saveService" class="cn.hncu.stud.service.StudServiceImpl">
        <property name="studDao" ref="studDao"></property>
        <property name="bookDao" ref="bookDao"></property>
    </bean>
</beans>

servlet中加入此方法,实现service的初始化:

@Override
    public void init() throws ServletException {
        //在这里,我们可以直接获取Web中的Spring容器-不能重新去new,因为那样就不是同一个容器的了
        ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
        service=ctx.getBean(ISaveService.class);
    }

TxAdvice-AOP通知

package cn.hncu.utils;
import java.sql.Connection;
import javax.sql.DataSource;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
//另外一种方法获取Web中的spring容器--实现ApplicationContextAware接口
public class TxAdvice implements MethodInterceptor,ApplicationContextAware{
    private ApplicationContext ctx =null;
    @Override
    public void setApplicationContext(ApplicationContext ctx)
            throws BeansException {
        this.ctx=ctx;
    }
    //通知---这个里面需要拿到dataSource,所以需要先拿到Spring的容器
    @Override
    public Object invoke(MethodInvocation invocation) throws Throwable {
        DataSource dataSource = ctx.getBean(DataSource.class);
        Connection con = dataSource.getConnection();
        Object res =null;
        try {
            con.setAutoCommit(false);
            //开启一个事务
            res = invocation.proceed();//放行
            con.commit();//提交
            System.out.println("提交一个事务...");
        } catch (Exception e) {
            con.rollback();
            System.out.println("事务回滚...");
        }finally{
            con.setAutoCommit(true);//关闭事务
            con.close();
        }
        return res;
    }
}



相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
16天前
|
安全 Java Ruby
我尝试了所有后端框架 — — 这就是为什么只有 Spring Boot 幸存下来
作者回顾后端开发历程,指出多数框架在生产环境中难堪重负。相比之下,Spring Boot凭借内置安全、稳定扩展、完善生态和企业级支持,成为构建高可用系统的首选,真正经受住了时间与规模的考验。
112 2
|
2月前
|
XML JSON Java
Spring框架中常见注解的使用规则与最佳实践
本文介绍了Spring框架中常见注解的使用规则与最佳实践,重点对比了URL参数与表单参数的区别,并详细说明了@RequestParam、@PathVariable、@RequestBody等注解的应用场景。同时通过表格和案例分析,帮助开发者正确选择参数绑定方式,避免常见误区,提升代码的可读性与安全性。
|
5天前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
52 8
|
3天前
|
开发框架 前端开发 Go
【GoGin】(0)基于Go的WEB开发框架,GO Gin是什么?怎么启动?本文给你答案
Gin:Go语言编写的Web框架,以更好的性能实现类似Martini框架的APInet/http、Beego:开源的高性能Go语言Web框架、Iris:最快的Go语言Web框架,完备的MVC支持。
65 1
|
2月前
|
运维 数据可视化 C++
2025 热门的 Web 化容器部署工具对比:Portainer VS Websoft9
2025年热门Web化容器部署工具对比:Portainer与Websoft9。Portainer以轻量可视化管理见长,适合技术团队运维;Websoft9则提供一站式应用部署与容器管理,内置丰富开源模板,降低中小企业部署门槛。两者各有优势,助力企业提升容器化效率。
252 1
2025 热门的 Web 化容器部署工具对比:Portainer VS Websoft9
|
1月前
|
监控 Kubernetes Cloud Native
Spring Batch 批处理框架技术详解与实践指南
本文档全面介绍 Spring Batch 批处理框架的核心架构、关键组件和实际应用场景。作为 Spring 生态系统中专门处理大规模数据批处理的框架,Spring Batch 为企业级批处理作业提供了可靠的解决方案。本文将深入探讨其作业流程、组件模型、错误处理机制、性能优化策略以及与现代云原生环境的集成方式,帮助开发者构建高效、稳定的批处理系统。
211 1
|
2月前
|
设计模式 Java 开发者
如何快速上手【Spring AOP】?从动态代理到源码剖析(下篇)
Spring AOP的实现本质上依赖于代理模式这一经典设计模式。代理模式通过引入代理对象作为目标对象的中间层,实现了对目标对象访问的控制与增强,其核心价值在于解耦核心业务逻辑与横切关注点。在框架设计中,这种模式广泛用于实现功能扩展(如远程调用、延迟加载)、行为拦截(如权限校验、异常处理)等场景,为系统提供了更高的灵活性和可维护性。
|
3月前
|
安全 Java 微服务
Java 最新技术和框架实操:涵盖 JDK 21 新特性与 Spring Security 6.x 安全框架搭建
本文系统整理了Java最新技术与主流框架实操内容,涵盖Java 17+新特性(如模式匹配、文本块、记录类)、Spring Boot 3微服务开发、响应式编程(WebFlux)、容器化部署(Docker+K8s)、测试与CI/CD实践,附完整代码示例和学习资源推荐,助你构建现代Java全栈开发能力。
410 1
|
2月前
|
Cloud Native Java API
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
Java Spring框架技术栈选和最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
337 0
|
3月前
|
缓存 安全 Java
第五章 Spring框架
Spring IOC(控制反转)通过工厂模式管理对象的创建与生命周期,DI(依赖注入)则让容器自动注入所需对象,降低耦合。常见注解如@Component、@Service用于声明Bean,@Autowired用于注入。Bean默认单例,作用域可通过@Scope配置,如prototype、request等。Spring通过三级缓存解决循环依赖问题,但构造函数循环依赖需用@Lazy延迟加载。AOP通过动态代理实现,用于日志、事务等公共逻辑。事务通过@Transactional实现,需注意异常处理及传播行为。
49 0

热门文章

最新文章