问题来源 最近在集成spring和mybatis时遇到了很多问题,从网上查了也解决了,但是就是心里有点别扭,想看看到底怎么回事,所以跟了下源码,终于发现了其中的奥妙. 问题分析 首先我们来看看基本的配置. spring的配置: <!-- 数据库配置 --> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="…
为了说明后续的Mybatis扩展,插播一篇广告,先来简要说明一下Mybatis的一种原生用法,不过先声明:下面说的只是Mybatis的其中一种用法,如需要更深入了解Mybatis,请参考官方文档,或者研读源码. 我们知道,使用Mybatis的方式有很多种,从是否集成上分,可以单独使用,也可以和Spring集成使用:从使用方式上分,可以编写静态工具类,在静态工具中调用SqlSession,也可以直接注入SqlSession/ SqlSessionTemplate,还可以编写Dao接口,让mybat…
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. PersonDao.java public interface PersonDao { public void savePerson(); } PersonDaoImpl.java public class PersonDaoImpl implements PersonDao{ public void save…
1.前言 上一期讲到MyBatis-Statement版本的增删改查.可以发现.这种代码写下来冗余的地方特别多.写一套没啥.如果涉及到多表多查询的时候就容易出现问题.故.官方推荐了一种方法.即MyBatis基于动态代理方式的增删改查.它是一种基于接口开发.Mapper动态的对SQL进行寻找.通过具体概念请点击此处 查阅.这里不过多解释.代码中有详细的注释. 项目骨架如图所示: 2.前期准备 1.编写conf.xml <?xml version="1.0" encoding=&qu…
@Transaction:  http://blog.csdn.net/bao19901210/article/details/41724355 Spring上下文:  http://blog.csdn.net/yang123111/article/details/32099329 情况是这样的: @Transactional public void test(){ System.out.println("1 insert db..."); try { ((XxxService)Aop…
mybatis之动态代理的应用 在前文(https://www.cnblogs.com/NYfor2018/p/9093472.html)我们知道了,Mybatis的使用需要用到Mapper映射文件,一个是映射接口,另一个是映射XML文件(此处不详谈映射文件XML),在应用中我们可以感觉到,映射接口似乎对接着XML文件中的实现命令,可是我们在运行程序是时候调用的往往是Mapper接口,而不是一个包含逻辑的实现类.很显然Mapper产生了代理类. 首先,什么是代理模式?代理模式的定义:为其他对象提…
在开始动态代理的原理讲解以前,我们先看一下集成mybatis以后dao层不使用动态代理以及使用动态代理的两种实现方式,通过对比我们自己实现dao层接口以及mybatis动态代理可以更加直观的展现出mybatis动态代理替我们所做的工作,有利于我们理解动态代理的过程,讲解完以后我们再进行动态代理的原理解析,此讲解基于mybatis的环境已经搭建完成,并且已经实现了基本的用户类编写以及用户类的Dao接口的声明,下面是Dao层的接口代码 public interface UserDao { /* 查询…
一.使用传统方式的dao的书写方式,不建议.目前采用的是动态代理的方式交给mybatis进行处理. 首先回顾下动态代理要求: 1)子配置文件的中,namespace需要是接口的全路径,id是接口的方法名称 这两项唯一确定我们的调用的接口. 2)子mapper文件的名称要和接口的名称保持一致. 3)参数和返回值要和方法的保持一致. 二.整合 1)dao代码: dao的代码,只需要保留接口即可. 2)service的代码: 实现类发生变化. 动态代理dao的id的名字是: 类名首字母小写 packa…
先看项目目录结构 很清爽了 最重要的Spring的核心配置文件,看一下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p=&q…
之前写了一篇文章IOC该博客--<Spring容器IOC解析及简单实现>,今天再来聊聊AOP.大家都知道Spring的两大特性是IOC和AOP. IOC负责将对象动态的注入到容器,从而达到一种须要谁就注入谁,什么时候须要就什么时候注入的效果,可谓是招之则来,挥之则去. 想想都认为爽,假设现实生活中也有这本事那就爽歪歪了.至于有多爽,各位自己脑补吧.而AOP呢,它实现的就是容器的还有一大优点了.就是能够让容器中的对象都享有容器中的公共服务. 那么容器是怎么做到的呢?它怎么就能让在它里面的对象自己…
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 以简单模拟事务的执行过程说明各种代理区别 1.1 静态代理 由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. ? 1 2 3 4 public interface PersonDao…
一.动态代理简介 动态代理与普通代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每个方法进行中转. 动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法.该方法就是调用被代理接口的所有方法时需要调用的,而invoke方法返回的值是被代理接口的一个实现类. 二.实例解析 接口: <span style="font-family…
一.为什么要使用动态代理         当一个对象或多个对象实现了N中方法的时候,由于业务需求需要把这个对象和多个对象的N个方法加入一个共同的方法,比如把所有对象的所有方法加入事务这个时候有三种方法:         方法一:一个一个对象一个一个方法去加,很显然这个方法是一个比较笨的方法.         方法二:加一个静态代理对象将这个静态代理对象实现要加事务对象的接口.然后在静态代理对象里面每个方法里面加上事务.         方法三:使用动态代理对象,进行动态的加载事务.      …
转自:http://zhangbo-peipei-163-com.iteye.com/blog/2033832?utm_source=tuicool&utm_medium=referral 我只是做个笔记,大家如果翻到这里了,最好还是去上面的链接中看原文吧. 最近在用mybatis做项目,需要用到mybatis的拦截器功能,就顺便把mybatis的拦截器源码大致的看了一遍,为了温故而知新,在此就按照自己的理解由浅入深的理解一下它的设计. 和大家分享一下,不足和谬误之处欢迎交流.直接入正题. 首先…
一.aop编程思想 1.面向切面,就是能够不动源码的情况下,从横切面切入新的代码功能. 2.实现原理是动态代理 动态代理的步骤 a.写生产厂家,实现接口,代理只能代理接口 b.动态代理类实现InvocationHandler接口,实现bind方法来绑定厂家,重写invoke方法 c.消费者找动态代理类来获取商品消费 3.aop的作用:是将系统级别的重复的操作统一实现,节省代码,扩展性更好 例如:系统日志,系统非法访问,系统权限,系统事务 二.spring怎么实现AOP 1.在spring的配置文…
1.背景介绍 拦截器顾名思义为拦截某个功能的一个武器,在众多框架中均有“拦截器”.这个Plugin有什么用呢?或者说拦截器有什么用呢?可以想想拦截器是怎么实现的.Plugin用到了Java中很重要的一个特性——动态代理.所以这个Plugin可以理解为,在调用一个方法时,我“拦截”其方法做一些我想让它做的事(包括方法的前与后).在Mybatis中可以拦截以下方法: 这正是mybatis中大名鼎鼎的四大对象: 2.源码过程跟踪,了解拦截器拦截过程以及原理 //ParameterHandler 处理s…
使用Mybatis 开发Web 工程时,通过Mapper 动态代理机制,可以只编写接口以及方法的定义. 如下: 定义db.properties driver=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:1521:orcl username=scott password=tiger 定义SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8"?…
目录结构及配置文件与原始dao方法相比更简便 只需一个UserMapper的接口,放在一起的配置文件,配置文件中namespace的地址确定jdk动态代理的对象 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybati…
Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类. 首先我们来用代码简单演示jdk动态代理: 现在有一个商品的增删改查的操作 /** * 商品操作接口 */ public interface ProductService { public void add(); public void edit(); public void delte(); public void select(); } /** * 实现类 */ public class Pr…
动态代理的方式实现增删改查: 通过约定的方式定位sql语句 约定 > 配置文件 > 硬编码 约定的目标是省略掉通过硬编码的方式定位sql的代码,通过接口直接定位出sql语句,以下代码为通过硬编码的方法定位sql: //读取conf.xml 配置文件 Reader reader = Resources.getResourceAsReader("conf.xml"); //创建sqlSessionFactory SqlSessionFactory sessionFactory…
AOP即面向切面编程.AOP是基于代理模式的. 代理模式: 当我们需要修改一个类,在类中加入代码时,为了不破坏这个类的封装性.可以使用代理模式,建立一个代理类. 比如:修改需求,在调用UserController类的saveUser()方法之前要判断用户是否有权限,普通的办法我们可以直接修改类中的saveUser()方法.用代理模式就是,建立一个代理类,在调用saveUser()方法之前再加入鉴权的方法,以后调用时我们调用代理类,而不直接调用UserController类了. class Use…
目录 一.先看一个计算器的抽取和实现 二.使用动态代理解决以上问题. 1 设计原理 2 代码实现 2.1 接口代码 2.2 实现接口的代码 2.3 测试代码 2.3 创建动态代理类 2.4 动态代理类代码说明 2.5 前置通知,后置通知,返回通知,异常通知 一.先看一个计算器的抽取和实现 图中,有两个需求 需求1-日志:在程序执行期间追踪正在发生的活动 需求2-验证:希望计算器只能处理正数的运算 其中实现的代码片段 从代码片段中可以看出,代码混乱,代码分散,如果日志需求变更,必须修改所有方法.…
Mapper接口开发方法编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象. Mapper接口开发方式是基于入门程序的基础上,对 控制程序 进行分层开发,只需要 编写mapper接口 和 Mappe.xml 配置文件即可. 程序员编写mapper接口需要遵循一些开发规范,mybatis可以自动生成mapper接口实现类代理对象. 开发规范 - Mapper接口开发需要遵循以下规范: ① Mapper.xml文件中的namespace与mapper接口…
动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码.动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类. 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序 java.lang.reflect.InvocationHand…
在上一章我们看到了,新增的三种类都能实现对原始功能类进行添加功能的事务处理,这三种类就是一个代理. 但是这种代理是写死的,怎样实现对任意接口添加自定义的代理呢? 我们先来看一下之前的代理实现: public class Impeat { private InterfaceDo todo; public Impeat(InterfaceDo todo) { super(); this.todo = todo; } public void dothings() { todo.dosomething(…
@Aspect@Componentpublic class AopText { @Pointcut("execution(public * com.llf.service.*Service.*(..))") public void leanPoint(){ } @Before("leanPoint()") public void before(){ System.out.print("前置..."); } @After("leanPoi…
1.代理模式readMe: 代理设计模式: 是java中常用的设计模式! 特点: .委托类和代理类有相同的接口或者共同的父类! .代理类为委托类负责处理消息,并将消息转发给委托类! .委托类和代理类对象通常存在关联关系! 一个代理类对象与一个委托类对象关联! .代理类本身并不是真正的实现者!而是通过调用委托类的方法, 来实现功能! 按照代理类创建的时机,代理类分为两种: .静态代理:由我们程序猿或者特定的工具自动生成了源代码, 在程序运行之前,.class文件已经存在了! (serviceImp…
在之前的文章中我们了解到最终的数据库最终操作是走的代理类的方法: @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { SqlSession sqlSession = getSqlSession( SqlSessionTemplate.this.sqlSessionFactory, SqlSessionTemplate.this.executorType, Sql…
我们常常会遇到这样的事,项目经理让你为一个功能类再加一个功能A,然后你加班为这个类加上了功能A: 过了两天又来了新需求,再在A功能后面加上一个新功能B,你加班写好了这个功能B,加在了A后面:又过 了几天天,项目经理说这两个新加的功能顺序需要调换一下,然后你找到一个礼拜之前的写的源代码,看了 一遍想起来当时是怎么实现的了,这部分是功能A,那部分是功能B,然后巴拉巴拉换了顺序.看到这是不是 觉得很烦,动不动就要在源码上加新功能,完了又要在源码上换新功能的顺序,那么一大坨源码,还好是自 己写的源码,理…
这个问题网上大部分都说xml文件中的路径不对 或者是resources之类的问题,如果那些文章的解决方案解决不了你的问题的话,可以看一下我遇到的这种情况: 前提: mybatis-config.xml内 映射器用的是这种方式: <mappers> <!--如果只需要管理一个mapper 可以直接写如下方式 并且其物理路径不需要与其xml文件路径相同--> <!--<mapper resource="UserMapper.xml"></ma…