Spring + SpringMVC + Druid + JPA(Hibernate impl) 给你一个稳妥的后端解决方案

简介:

1. 采用到的开源项目漫谈

   Spring 迷人的依赖注入特性, 使其已经稳稳的占据在 JavaEE 项目引用开源项目列表中的上层位置。

   秉承低耦合高内聚的遵旨, Spring 提倡的对象工厂解耦类关系的思想已深入到每个攻城狮的心中。

   SpringMVC 做为 Spring 的干儿子,最让我沉醉的是她强大的扩展能力,深邃的像大海一样。

   前端无论是 freemarker/velocity/jsp...,后端 DAO 层无论是传统的 ORM 还是新近上位的领域模型。

   她的态度始终如一,给你360度最贴心的呵护,有一人对你如此,此生足矣。

   官网地址:http://projects.spring.io/spring-framework/

   项目中关于 SpringMVC + Spring 的依赖:

复制代码
       <!--spring mvc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.3.RELEASE</version>
        </dependency>

        <!-- Spring-orm -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.3.3.RELEASE</version>
        </dependency>

        <!-- Spring AOP 动态代理 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
复制代码

   这上面我想说的是 AspectJ 这个东东, AspectJ 是最早、功能比较强大的 AOP 实现之一。

   在 Java 领域,AspectJ 中的很多语法结构基本上已成为 AOP 领域的标准。

   Spring 也有自己的 Spring-AOP,Spring-AOP 采用运行时生成代理类,底层可以选用 JDK 或者 CGLIB 动态代理。

   通俗点,AspectJ 在编译时增强要切入的类,而 Spring-AOP 是在运行时通过代理类增强切入的类,效率和性能可想而知。

   所以 Spring 在 2.0 的时候就已经开始支持 AspectJ ,现在到 4.X 的时代已经很完美的和 AspectJ  结合到一起。

   有兴趣的可以在接着读读:https://www.oschina.net/translate/comparative_analysis_between_spring_aop_and_aspectj?cmp

   Druid 出自阿里巴巴技术团队之手,个人认为是比较好的数据库连接池之一,尤其是监控部分是我的最爱。

   官方 github 地址:https://github.com/alibaba/druid/wiki/常见问题

   项目中的 web.xml 配置监控配置和监控界面:

复制代码
   <!--Druid 数据库连接池监控-->
    <servlet>
        <servlet-name>DruidStatView</servlet-name>
        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>DruidStatView</servlet-name>
        <url-pattern>/druid/*</url-pattern>
    </servlet-mapping>
复制代码

 

 

   JPA 作为 Sun 公司引入的 ORM 规范,就像是 JDBC 之于各种数据库驱动 Jar,

   不要去在意使用了什么样的数据库,用 JDBC 提供的规范方法去撸代码即可。

   JPA 制定持久层规范,相同与抽象接口,有 ORM 框架撸具体的实现层。

   Sun 想实现 ORM 技术统一,可能不远的将来,你不用在纠结选择什么样子的 ORM 框架。

   而现有热门的 ORM 框架会渐渐失去光泽,这毕竟是个漫长的过程,让我们拭目以待。

2. 方案整体一览

   方案中所有的类都位于 SpringContext 中,由 Spring 统一进行管理。

   让 Spring 统一管理的前提是你要告诉有这样一个类需要它管理,目前我接触到的告诉途径有两种。

   传统的 xml 配置和注解方式,xml 配置和注解方式各有优劣,比如 xml 配置的优点:

   a. 如果你公司项目在引用另外一个公司的 jar,这时候,唯一可行方式为 xml 配置。

   b. 如果类之间的依赖关系变动频繁,xml 配置是比较优秀的,改动代码和改动配置文件,无论是技术上还是风险上,xml 都稳赢注解。

   注解声明的方式优点:代码和声明在一起,开发的时候不用切来切去,比 xml 配置声明要简单明了的多。

   现在很多主流的框架都引入了注解,但也无法摈弃 xml 配置声明的方式。

   

   在这个方案中我使用干净简单注解的方式,controller 包下使用注解@controller,dao-impl 包下使用@Repository,service 包下使用@service。

  控制层注入服务实例,服务层注入数据访问层对象,持久层对象由 JAP 进行注解,页面通过控制层来传输和获取数据。

  web.xml:

  View Code

  maven pom.xml:

  View Code

3. DAO 层的种种设计思路

   Controller 和 Service 层非常容易理解,这里不赘述了。

   DAO 层 中 BasePo 希望将一些共有的属性抽象在父类当中(属性由具体项目需求决定)。

  BasePO

   BaseDaoImpl 希望将一些公共的数据访问方法实现在父类当中(我这里的方法可能有点少,可以由具体项目增加)。

  BaseDaoImpl

   使用 JAP 注解编写业务使用到的持久层对象(主流的开发工具都支持由数据库反向生成持久层对象)。

复制代码
@Entity
@Table(name = "t_user")
public class User extends BasePO {
    @Column(nullable = false)
    String name;
    @Column(nullable = false)
    String pwd;
....getter/setter }
复制代码

   配置启动时扫描 POJO 的动作,至于是新建还是更新都有配置选项,可以自己查阅相关文档。

复制代码
    <!-- 配置hibernate session工厂,需添加 spring-orm -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            </props>
        </property>

        <!-- 自动扫描注解方式配置的hibernate类文件 -->
        <property name="packagesToScan">
            <list>
                <value>com.rambo.sdh.pojo</value>
            </list>
        </property>
    </bean>
复制代码

   操纵数据库最主要的事务管理,采用 AOP 声明方式,在执行含有数据变动的方法前后进行拦截。

   采用 AOP 声明方式进行拦截的好处,不用去关注数据库事务的开启和关闭,将重心放到业务逻辑上面。

复制代码
    <!-- 配置事务管理器 -->
    <bean name="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <!-- 1)基于 <tx> 和 <aop> 命名空间的声明式事务管理:transaction-manager指定事务管理器为transactionManager- -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="save*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="edit*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="modify*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="delete*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="remove*" propagation="REQUIRED" rollback-for="Exception"/>
            <tx:method name="get*" propagation="NOT_SUPPORTED" read-only="true"/>
            <tx:method name="find*" propagation="NOT_SUPPORTED" read-only="true"/>
            <tx:method name="list*" propagation="NOT_SUPPORTED" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="transactionPointcut" expression="execution(* com.rambo.sdh.*.dao.impl.*.*(..))"/>
        <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
    </aop:config>

    <!--2)基于 @Transactional 的方式将声明式事务管理:激活启用事务相关处理 Bean 配置-->
    <tx:annotation-driven transaction-manager="transactionManager"/>
复制代码

   方式一在包 com.rambo.sdh.*.dao.*Impl.* 下所执行的已 add/save/update.....开头的方法。

   方法在执行前后都会被 HibernateTransactionManager 拦截,进行事务的开启和关闭。

   方式二在你想进行事务管理的接口、接口方法、类以及类方法上添加 @Transactional  注解。

   当然还有一些其他的事情,有兴趣可以 debug 源码去一探究竟。

   貌似说的也差不多了,该方案为 JavaEE 后端解决方案,前端用你想用的渲染技术即可。

   项目开源 GIT 地址已在最上面给出,如果有兴趣的可以检出到本地跑一跑,该方案中小公司其实都挺适合,上手和开发速度快。


本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/5951738.html,如需转载请自行联系原作者

相关文章
|
3月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
6月前
|
Java 数据库连接 API
Java 8 + 特性及 Spring Boot 与 Hibernate 等最新技术的实操内容详解
本内容涵盖Java 8+核心语法、Spring Boot与Hibernate实操,按考试考点分类整理,含技术详解与代码示例,助力掌握最新Java技术与应用。
201 2
|
7月前
|
Java API 数据库
JPA简介:Spring Boot环境下的实践指南
上述内容仅是JPA在Spring Boot环境下使用的冰山一角,实际的实践中你会发现更深更广的应用。总而言之,只要掌握了JPA的规则,你就可以借助Spring Boot无比丰富的功能,娴熟地驾驶这台高性能的跑车,在属于你的程序世界里驰骋。
292 15
|
6月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
197 0
|
8月前
|
druid Java 关系型数据库
Spring Boot与Druid升级解决方案
好的,我需要帮助用户解决他们遇到的数据库连接问题,并升级项目的依赖。首先,用户提供的错误信息是关于Spring Boot应用在初始化数据源时抛出的异常,具体是Druid连接池验证连接失败。同时,用户希望升级项目的依赖版本。
821 10
|
9月前
|
监控 Java 关系型数据库
Spring Boot整合MySQL主从集群同步延迟解决方案
本文针对电商系统在Spring Boot+MyBatis架构下的典型问题(如大促时订单状态延迟、库存超卖误判及用户信息更新延迟)提出解决方案。核心内容包括动态数据源路由(强制读主库)、大事务拆分优化以及延迟感知补偿机制,配合MySQL参数调优和监控集成,有效将主从延迟控制在1秒内。实际测试表明,在10万QPS场景下,订单查询延迟显著降低,超卖误判率下降98%。
430 5
|
9月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
410 0
|
9月前
|
SQL Java 编译器
深入理解 Spring Data JPA 的导入与使用:以 UserRepository为例
本文深入解析了 Spring Data JPA 中 `UserRepository` 的导入与使用。通过示例代码,详细说明了为何需要导入 `User` 实体类、`JpaRepository` 接口及 `@Repository` 注解。这些导入语句分别用于定义操作实体、提供数据库交互方法和标识数据访问组件。文章还探讨了未导入时的编译问题,并展示了实际应用场景,如用户保存、查询与删除操作。合理使用导入语句,可让代码更简洁高效,充分发挥 Spring Data JPA 的优势。
579 0
|
9月前
|
安全 前端开发 Java
Spring Boot 项目中触发 Circular View Path 错误的原理与解决方案
在Spring Boot开发中,**Circular View Path**错误常因视图解析与Controller路径重名引发。当视图名称(如`login`)与请求路径相同,Spring MVC无法区分,导致无限循环调用。解决方法包括:1) 明确指定视图路径,避免重名;2) 将视图文件移至子目录;3) 确保Spring Security配置与Controller路径一致。通过合理设定视图和路径,可有效避免该问题,确保系统稳定运行。
641 0
|
6月前
|
人工智能 Java API
后端开发必看:零代码实现存量服务改造成MCP服务
本文介绍如何通过 **Nacos** 和 **Higress** 实现存量 Spring Boot 服务的零代码改造,使其支持 MCP 协议,供 AI Agent 调用。全程无需修改业务代码,仅通过配置完成服务注册、协议转换与工具映射,显著降低改造成本,提升服务的可集成性与智能化能力。
1907 1