Spring+Hibernate:Aop相关概念与动态代理

Spring事务与AOP原理深度解析:从注解到动态代理的实现机制 在Java企业级开发中,面向切面编程(AOP)是一种重要的设计范式,其核心思想是将横切关注点(如事务管理、日志记录)从核心业务逻辑中分离,实现代码的解耦与复用。AOP通过动态代理技术,在不修改源代码的情况下,为方法调用添加额外行为,这一机制正是Spring框架实现声明式事务管理的基石。Spring事务的本质是利用AOP拦截目标方法,在方法执行前后自动处理事务的开启、提交与回滚,从而将开发者从繁琐的模板代码中解放出来。这种设计不仅提升了代码的整洁度,还确保了事务的一致性与可靠性。在实际应用中,Spring事务 阅读详情

本博文也是属于学习总结性博文,主要来学习Spring+Hibernate的声明式事务。为此,我们从分三步进行:

  1. Spring + Hibernate : Aop相关概念与动态代理;
  2. Spring + Hibernate : 声明式事务;

  1. AOP 概念
    Aspect Oriented Programming 面向横切面的编程:
    横切性关注点: 是一种遍布在系统各个角落的、与我们的业务逻辑相结合的不是太紧密的、独立的服务,例如安全性检查、事务等。
    而我们的AOP主要是处理这些横切面关注点;

  • Cross Cutting concern :
    • 横切性关注点,是一种遍布在系统流程之中的独立服务;
  • Aspect :
    • 对这些横切性关注点的模块化,也就是将这些横切性关注点封装成一个类;
  • Advice :
    • 对这些横切性关注点的具体实现,及其使用方式,在业务流程方法调用之前、之后和抛出异常等使用方式。
  • Jointpoint :
    • 连接点,对Spring来说就是方法调用,也可以理解成Advice执行的时机。Jointpoint 分为方法调用和属性修改,对Spring来说它只支持方法调用;
  • Pointcut :

    • 对Advice应用范围进行限定,定义了Pointcut应用到那些Jointpoint上;
  • Weave :

    • 将Advice应用到目标对象上的过程,成为织入;
  • TargetObject :

    • 目标对象,Advice 应用的对象;
  • Proxy :

    • Spring AOP 默认使用的代理时JDK 的动态代理,我们也可以使用CGLIB代理,两者的区别: JDK动态代理只能对实现了接口的累进行代理,而CGLIB可以对所有的类进行代理,因为它使用了继承的方式来实现代理;
  • Introduction :

    • 引入,动态地为类添加方法;

这里写图片描述


  1. 通过如下简单示例对静态代理,动态代理和AOP进行比较说明,
    项目结构:
    这里写图片描述

2.1 静态代理,com.staticProxy.manager

interface UserManager:

package com.staticProxy.manager;
//只有两个简单的方法 添加用户和查找用户;
public interface UserManager {

    public void addUser(String name,String password);

    public Object findUser(String id);
}

Class UserManagerImpl:

package com.staticProxy.manager;

public class UserManagerImpl implements UserManager {

    @Override
    public void addUser(String name, String password) {
        System.out.println("UserManagerImpl.add()"+ name+" "+password);
    }

    @Override
    public Object findUser(String id) {
        System.out.println("UserManagerImpl.findUser()"+id);
        return "User1";
    }

}

假如现在的业务发生改变,我们在添加用户和查找用户时,都要进行安全性检查,如何解决这个问题;奔着对扩展开放,对修改关闭的原则,我们怎么修改,引入静态代理模式:

Class UserManagerImplProxy

package com.staticProxy.manager;

public class UserManagerImplProxy implements UserManager {

    //使用静态代理的关键是拿到代理目标的引用,
    //在此我们通过构造函数的方式拿到;也可以setter getter;
    private UserManager userManager;
    //通过构造函数拿到被代理对象的引用;
    public UserManagerImplProxy(UserManager userManager){
        this.userManager = userManager;
    }

    @Override
    public void addUser(String name, String password) {
        //增加安全性检查操作;
        checkSecurity();
        userManager.addUser(name, password);
    }

    @Override
    public Object findUser(String id) {
        //增加安全性检查操作
        checkSecurity();
        userManager.findUser(id);
        return null;
    }

    //将安全性检查的操作封装成一个方法;
    private void checkSecurity(){
        System.out.println("---checkSecurity()---");
    }
}

测试静态代理方法

public class ProxyTest extends TestCase {

    public void testStaticProxy(){
        //将被代理对象的引用传入;
        UserManager userManager = new UserManagerImplProxy(new UserManagerImpl());
        userManager.addUser("zhangsan", "123");
        userManager.findUser("abc");
    }
}

分析:
1. 在代理对象中,我们得为每个方法手动的添加安全性检查代码 checkSecurity(),如果代理类中的方法很多,这就会很麻烦;
2. 如果UserManager有多个实现呢,我们需要为每个实现创建一个代理对象,并在每个方法上加安全性检查操作
3. 在调用时,

UserManager manager = new UserManagerImpl();

变成了:

UserManager manager = new UserManagerImplProxy(new UserManagerImpl());

引入了工厂字眼,代码复杂了;


如何为实现了某些接口的类动态的创建一个代理,并且在代用这些实现方法时,自动的加上安全性检查代码呢?

2.2 动态代理-JDK的动态代理 com.dynamicProxy.manager

interface UserManager 和 UserManagerImpl和以前一样

package com.dynamicProxy.manager;

public interface UserManager {

    public void addUser(String name,String password);

    public Object findUser(String id);
}
package com.dynamicProxy.manager;

public class UserManagerImpl implements UserManager {

    @Override
    public void addUser(String name, String password) {
        System.out.println("UserManagerImpl.add()"+ name+" "+password);
    }

    @Override
    public Object findUser(String id) {
        System.out.println("UserManagerImpl.findUser()"+id);
        return "User2";
    }

}

动态代理类:SecurityHandler

package com.dynamicProxy.manager;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//JDK动态代理必须实现InvocationHandler接口重写invoke方法
public class SecurityHandler implements InvocationHandler {

    //step 1: 拿到要被代理的目标对象 targetObject
    private Object targetObject;

    //setp 2: 生成代理对象;
    // 在生成代理对象的同时,我们将被代理的目标对象转入,当然有多种传入方式;
    //三个参数:ClassLoader loder: 类加载器,使用目标对象的类加载器;
    //Class<?>[] interfs:目标对象实现的接口,如果这个目标有五个接口,会为每个接口创建一个代理;
    //InvocationHander h: 上两步已经将代理对象生产,那么我们在调用代理的方法时,代理对象会自动调用InvocationHander的invoke方法;
    public Object createDynamicProxy(Object targetObject){
        this.targetObject = targetObject;

        //使用Proxy生成代理;
        Object dynamicProxy = Proxy.newProxyInstance(
                targetObject.getClass().getClassLoader(), 
                targetObject.getClass().getInterfaces(),
                this
                );

        return dynamicProxy;

    }

    //调用代理的每个方法都会自动转到InvocationHandler的invoke方法,因为在
    //代理对象中有InvocationHandler的引用this
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //安全性检查代码,会动态为每个方法加上;
        checkSecurity();
        //实际调用目标对象的方法;
        //obj: 要调用的目标对象
        // args: 目标对象的参数,这个由代理自动传过来;
        Object result = method.invoke(targetObject, args);

        return result;
    }

    private void checkSecurity(){
        System.out.println("-----------checkSecurity()-danymicProxy------------");
    }

}

测试类:

import com.dynamicProxy.manager.SecurityHandler;
import com.staticProxy.manager.UserManager;
import com.staticProxy.manager.UserManagerImpl;
import com.staticProxy.manager.UserManagerImplProxy;

import junit.framework.TestCase;

public class ProxyTest extends TestCase {
    public void testDynamicProxy(){
        UserManager userManager = (UserManager) new SecurityHandler().createDynamicProxy(UserManagerImpl());
        userManager.addUser("LiSi", "12306");
        userManager.findUser("001");
    }
}

Spring AOP对此进行了更好的封装,

2.3 AOP声明式服务:AspectJ 的annotation注解方式,

interface UserManager 和 UserManagerImpl和以前一样

class SecurityAspectAnno

package com.aspect.manager;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

// Step 1: 将横切性关注点封装成一个类;
//声明这是一个Aspcet
@Aspect
public class SecurityAspectAnno {

    //Step 2: 定义Advice应用的范围:Pointcut
    //定义一个Pointcut,范围用execution(正则表达),和名称addUserManager()
    @Pointcut("execution(* com.aspect.manager.UserManager.*(..))")
    private void addUserManager(){};

    // Step 3: 定义Advice;
    //定义advice,并关联到相应的Pointcut订阅的Jointpoint上;
    @Before("addUserManager()")
    private void checkSecurity(){
        System.out.println("-----------checkSecurity()-aspectJ------------");
    }
}

最后告诉Spring, 我们用了aspectj的annotation
applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans">     

    <!-- 开启AspectJ的annotation   -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

    <bean id="userManagerImpl1" class="com.aspect.manager.UserManagerImpl"/>
    <bean id="securityAspectAnno" class="com.aspect.manager.SecurityAspectAnno"/>

</beans>

2.3 AOP声明式服务:XML配置文件,

class SecurityAspectCfg

package com.aspect.manager;
//简简单单的不需要配置任何注释东西了;
public class SecurityAspectCfg {
    private void checkSecurityCfg(){    
        System.out.println("---checkSecurity()-Cfg---");
    }
}

我们在配置文件中声明Aspect相关内容;

<?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:tx="http://www.springframework.org/schema/tx"
     xmlns:aop="http://www.springframework.org/schema/aop"
     xmlns:context="http://www.springframework.org/schema/context"
     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
     http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">


    <bean id="userManagerImpl2" class="com.aspect.manager.UserManagerImpl"/>
    <bean id="securityAspectCfg" class="com.aspect.manager.SecurityAspectCfg"/>

    <aop:config>
        <aop:aspect id="checkAspect" ref="securityAspectCfg">
            <aop:pointcut expression="execution(* com.aspect.manager.UserManager.*(..))" id="addAddMethod"/>
            <aop:before method="checkSecurityCfg" pointcut-ref="addAddMethod"/>
        </aop:aspect>
    </aop:config>

</beans>

测试类:

import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.aspect.manager.UserManager;

import junit.framework.TestCase;

public class AspectJTest extends TestCase{

    private BeanFactory factory;
    protected void setUp() throws Exception {
        factory = new ClassPathXmlApplicationContext("applicationContext-aspectj.xml");
    }

    protected void tearDown() throws Exception {
    }

    public void testAspectJAnno(){
        UserManager userManager = (UserManager) factory.getBean("userManagerImpl2");
        userManager.addUser("zz","23");
        userManager.findUser("121");
    }
}

That’s all, thank you for your consideration. And, welcome any commonet.

Spring事务与AOP源码深度解析:从原理到实践,手写实现核心机制 在Java企业级开发中,Spring框架的事务管理和面向切面编程(AOP)是构建高内聚、低耦合应用的核心技术。事务管理通过声明式事务抽象,确保了复杂业务场景下的数据一致性,其底层依赖于动态代理和连接绑定等机制。AOP作为面向对象编程的有力补充,通过切面、通知和代理模式,将日志、安全等横切关注点与核心业务逻辑解耦,极大地提升了代码的可维护性。理解其原理,不仅能帮助开发者精准定位诸如事务传播行为不生效、AOP切面执行顺序错乱等常见问题,更能为应对高级技术面试和进行框架级定制开发奠定坚实基础。本文以Spring事 阅读详情

相关推荐

hibernate-aop

aop配置

java hibernate Aop_Spring4+Hibernate4 事务管理 配置 注解 AOP

在单独使用hibernate的时候使用如下配置:thread根据文档,这个是hibernate3.1以后的一个新扩展,目的在于可以让我们在某一个上下文环境(比如说当前线程)中可以通过SessionFactory.getCurrentSession()得到同一个session会话.该方式hibernate会自动关闭session,但是事务控制仍然需要手动开始和提交。public Long creat...

weixin_39630095的博客 315

SpringAOP整合Hibernate并使用事务

从http://www.cnblogs.com/sunniest/p/4543271.html 这里摘抄的源码,具体教程可以看这个文章

java hibernate Aop_java – 使用Spring AOP配置Hibernate会话

我有一个Spring Framework 4应用程序,它使用Hibernate 4.3.8作为JPA提供程序.我想使用Hibernate过滤器,因此我需要启用它们.我想在应用程序中全局执行此操作,我正在尝试使用Spring AOP.我的想法是,我可以编写一个方面,每次创建/获取会话时启用过滤器,如this和this问题.我已经将spring-aop和aspectjweaver依赖项添加到我的项目中...

weixin_33263633的博客 182

产品必备技能(十):如何绘制原型图?先要绘制页面流程图+页面原型图!附实操原型图、流程图实例(抖音)

文章目录目标题目实操步骤模板实操【抖音】APP的视频发布功能页面流程绘制页面流程图合格标准绘制页面原型图合格标准 目标 新入行的产品经理都对原型抱有向往的心境,但是有经验的产品经理不会一上来就画原型,而是先画页面流程再来画原型。通过学习,你将学会如何用页面流程图规划用户行为路径、如何借助原型识别问题、减少风险、有效沟通。 题目 任意选择一款你喜欢的产品,体验某个功能,下载并梳理此功能至少5个以上的页面流程跳转点(后面会解释),还原2 - 3个主要界面的低保真原型图。 实操步骤 可使用手绘以及Process

汪雯琦的博客 4830

手把手教你用Python实现双三次插值(附OpenCV对比测试)

本文深入解析了双三次插值算法的数学原理,并提供了从零开始的Python实现教程。通过与OpenCV官方实现的对比测试,详细评估了不同插值算法(包括最邻近差值、双线性插值)在图像质量与计算性能上的差异,帮助开发者掌握高质量图像缩放的核心技术。

weixin_29310605的博客 293

java hibernate Aop_Hibernate编程式事务与Spring Aop的声明式事务(spring与hibernate集成)

采用编程式事务事务主要分为:编程式事务和声明式事务1、SessionFactory.getCurrentSession()和SessionFactory.openSession()的区别?* 如果是SessionFactory.getCurrentSession()来创建session,在commit后session就自动关闭了,也就是不用再session.close()了* 如果使用的是Sess...

weixin_30346025的博客 241

【01】Canoe零基础手把手教学 --- Canoe安装

Canoe零基础手把手教学

jaytinlove的博客 7741

2020-01-21

测试方法

apr_su 298

保姆级教程:2026版Windows电脑换新,微信QQ聊天记录无损搬家(附路径修改避坑指南)

本文提供2026版Windows电脑换新时微信QQ聊天记录无损迁移的保姆级教程,涵盖最新版微信/QQ的存储路径修改和避坑指南。通过详细步骤和实战技巧,确保数据迁移过程中不丢失任何珍贵对话记录和文件,特别适合需要保留完整聊天记录的用户。

weixin_42629815的博客 2476

人形机器人硬件开发:骨架系统设计全攻略

本文以人形机器人骨架系统为核心研究对象,系统解析其从理论建模到工程实现的全流程设计方法。通过融合刚体力学、材料科学与机器人控制理论,构建"概念基础-理论框架-架构设计-实现机制-实际应用-高级考量-综合拓展"的七层分析体系。重点覆盖运动学/动力学建模、轻量化结构设计、关节模块集成、多物理场耦合优化等关键技术,结合波士顿动力Atlas、本田ASIMO等经典案例,提供从原型设计到量产验证的工程实践指南。

AI天才研究院 1870

代理模式与动态代理

代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。这种情况原因很多,比如需要创建一个开销很大的对象,或者被调用的对象在远程主机上,或者目标对象的功能还不足以满足需求。 代理模式一般涉及到的角色有 –抽象角色:声明真实对象和代理对象的共同接口(可以看成租房子一件事)

惟愿无事 623

微信商家转账报错“当前使用用户过多,请稍后重新确认收款”解决方案

当前使用用户过多,请稍后重新确认收款”这个错误,其实就是典型的参数误处理导致的假报错。记住一句话就行👇JSAPI 场景下的package参数不要做 UrlEncode。如果你也遇到这个问题,希望这篇文章能帮你少踩一个坑。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 784

CGLIB动态代理机制,各个方面都有写到

CGLIB库介绍 代理提供了一个可扩展的机制来控制被代理对象的访问,其实说白了就是在对象访问的时候加了一层封装。JDK从1.3版本起就提供了一个动态代理,它使用起来非常简单,但是有个明显的缺点:需要目标对象实现一个或多个接口。假如你想代理没有接口的类呢?可以使用CGLIB库。 CGLIB是一个强大的、高性能的代码生成库。它被广泛使用在基于代理的AOP框架(例如Spring AOP和dynaop)提供方法拦截。Hibernate作为最流行的ORM工具也同样使用CGLIB库来代理单端关联(集合懒加载除外,它使

weixin_46577306的博客 944

【keil5和STC-ISP】保姆级下载安装教程

点击下载中的产品下载。然后就会看到如下界面:可以看到,提供了针对不同芯片架构的四套独立开发工具。:你使用的51单片机,其核心就是。C51套件里的编译器是专门为这个架构优化的。:如果安装了MDK-Arm,你在创建新项目时将像“AT89C51”这样的51系列芯片型号,无法进行开发。进入如下界面:双击下载 → 双击运行安装 → 同意协议并下一步 → 使用默认安装路径 → 完成安装。

深耕CV 1635

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring事务与AOP核心原理深度解析:从源码到实战手写框架

在Java企业级开发中,Spring框架的事务管理与面向切面编程(AOP)是构建高可靠、可维护应用的核心技术。事务管理通过AOP机制,以非侵入方式为方法调用提供声明式事务控制,其底层依赖于动态代理技术实现逻辑织入。理解其原理对于解决实际开发中的事务失效、性能优化等问题至关重要。Spring AOP默认采用CGLIB代理,它通过生成目标类的子类来拦截方法调用,这解释了为何同类内部调用会导致@Transactional注解失效。通过手动实现一个简化版的AOP框架,可以直观体会代理创建、拦截器链与增强逻辑编织的过

weixin_33725807的博客 416

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一个叫Spring的框架,“SSH”框架之总结(Hibernate、Spring、SpringMVC)

通过学习一个叫Hibernate(冬眠)的框架后,进而学习一个叫Spring(春)的框架!! 在hibernate中我们主要是整合了DAO层对数据库的CRUD操作,而Spring主要是是为了让我们对标准三层架构(MVC)进行整合! ps:一下是一些我的总结(可能会有点乱,具体可以参看个人项目代码) ps:代码网盘链接:http://pan.baidu.com/s/1c2ISyjA 密码:bx

wenqiang612的博客 3206

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Spring相关面试题(1)

1、Spring 是如何管理事务的?事务机制?以及隔离级别? 事务的概念:事务必须服从ACID原则,ACID指的是原子性,一致性,隔离性,持久性;通俗理解事务就是一系列指令的集合; 事务特性: &amp;amp;nbsp; &amp;amp;nbsp; 原子性:操作指令时,要么全部成功,要么全部不执行,只要其中一个指令执行失败,所有的指令执行失败,数据进行回滚,回到指令前状态; &amp;amp;nbsp;&amp;amp;nbsp;一致性:事务的执行使数据从...

东建的博客 258

Spring重要知识点

IoC(Inverse of Control:控制反转)是⼀种设计思想,就是将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。IoC 在其他语⾔中也有应⽤,并⾮ Spring 所独有。IoC 容器是 Spring⽤来实现 IOC 的载体, IOC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。将对象之间的相互依赖关系交给 IOC 容器来管理,并由 IOC 容器完成对象的注⼊。这样可以很⼤程度上简化应⽤的开发,把应⽤从复杂的依赖关系中解放出来。

luoyuan的博客 1339

Spring学习总结—IOC和AOP

1. 概述 1.1 简介 Spring 是分层的 full-stack(全栈) 轻量级开源框架,以 IoC 和 AOP 为内核,提供了展现层Spring MVC和业务层事务管理等众多的企业级应⽤技术,还能整合开源世界众多著名的第三⽅框架和类库,已经成为使⽤最多的 Java EE 企业应⽤开源框架。 1.2 核心结构 Spring框架是一个轻量级的解决方案,可以一站式地构建企业级应用。Spring是模块化的,所以可以只使用其中需要的部分。主要包括几大模块:数据处理模块、Web模块、AOP/Aspect

dukay2021的博客 469

spring等框架相关梳理

spring是什么以及它的优点? spring是一个轻量级的ioc和aop容器框架 提供对事务的管理 是框架与框架的粘合剂。 IOC: 代表控制反转 以前是对象控制其他对象 现在所有的对象被spring控制 把对象注入到bean里 叫动态注入。 以前使用jsp和servlet进行开发 需要自己new对象 这样比较占内存 new一次就创建一次对象 现在交给spring进行管理后 不...

qq_43227109的博客 506

spring与hibernate的工作原理

spring工作原理 spring的最大作用ioc/di,将类与类的依赖关系写在配置文件中,程序在运行时根据配置文件动态加载依赖的类,降低的类与类之间的藕合度。它的原理是在applicationContext.xml加入bean标签,在bean标签中通过class属性说明具体类名、通过property标签说明该类的属性名、通过constructor-args说明构造子的参数。其一切都是返射,当通...

编程从这里开始 256

Java 23 种设计模式:从踩坑到精通 | 代理模式 —— 你的 AOP 就是用代理实现的

摘要:本文深入剖析了 Java 代理模式(Proxy Pattern)的三种实现形态(静态代理、JDK 动态代理、CGLIB 动态代理),并结合 Spring AOP 源码详细解读了代理机制的选择逻辑与自调用失效陷阱。文章从报表查询的性能优化场景切入,不仅涵盖了 MyBatis Mapper、RPC 框架等经典应用,还对比了装饰器模式,梳理了高频面试题,是 Java 开发者掌握“面向切面编程”基石的实战指南。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1069

Spring研磨分析、Quartz任务调度、Hibernate深入浅出系列文章笔记汇总

这系列文章主要是对Spring、Quartz、Hibernate等JavaWeb相关框架学习、并用于实践开发相当一段时间后,进行回顾总结的一系列笔记记录,对其中重点难点如IOC、AOP、数据库连接等进行了分析。主要是基于一些经典书籍文档讲解的基础上,融入自己实践的感悟,,基本文章中提到的实例都是经过实际代码测试的,也力求讲得通俗易懂。Spring基础部分下面是Spring基础部分的访问链接,供大家方

总结沉淀 2156

Struts+Hibernate+Spring

Struts struts是一个按MVC模式设计的Web层框架,实质是一个强大的Servlet。负责处理请求转发和路由。 struts的基本配置文件为struts-config.xml,里面配置了很多Action、ActionForm及中转规则,这个文件通过web.xml中的ActionServlet进行加载和初始化。 当用户请求发送到服务器端时,ActionServlet会接收到此请求,然后根...

qq_41973925的博客 334
上一篇: byte vs char 小结
下一篇: Spring+Hibernate : 声明式事务
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值