Bean 的循环依赖问题 - Spring 循环依赖源码分析
Bean 的循环依赖问题 - Spring 循环依赖源码分析老杜在课程中的 Spring 循环依赖源码分析部分,讲得有点虎头蛇尾,隔靴搔痒。
还是得自己追一遍源码呀。下面先给出相关的类和配置文件。
Husband 和 Wife 类
12345678910public class Husband { private String name; private Wife wife; public void setName(String name) { this.name = name; } public void setWife(Wife wife) { this.wife = wife; }}
1234567891011public class Wife { private String name; private Husband husband; public void setName(String name) { ...
GoF 之工厂模式 - 回顾已学过的设计模式
GoF 之工厂模式 - 回顾已学过的设计模式GoF 包含 23 种设计模式,其中有一些设计模式,老杜在之前的课程中(JavaSE JavaWeb MyBatis)中已经讲过。这里做一个简单的回顾。
设计模式优秀博客或文章
《深入设计模式》在线电子书网站
菜鸟教程 - 设计模式
hochan100 的博客园 - 设计模式分类
单例模式
单例模式是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。
在韩顺平的 JavaSE 课程中学过单例模式。
常见的实现方式有:懒汉式,饿汉式。
目前最佳实现方式是:单元素的枚举。
简单工厂模式,工厂方法模式,抽象工厂模式老杜的工厂模式讲解中,工厂方法模式讲得不够完美,讲义中的抽象工厂模式的内容除了开头,后面几乎都是错的,这里略作补充。建议阅读:
工厂模式(上):为什么说没事不要随便用工厂模式创建对象?抽象工厂模式
对象生产与对象消费的分离,或者说解耦,是工厂模式的最核心设计目的。
简单工厂模式,以相对简单的方式进行实现,来达到对象生产与消费分离的目的。但它的问题很明显:
不满足 OCP 原则,需要新增产品时,必须要 ...
MyBatis 参数处理 - 接口代理机制源码分析
MyBatis 参数处理 - 接口代理机制源码分析本章最后一节 @Param 源码分析 中,老杜简单提了下 JDK 的动态代理,以及代理模式中的一些概念,如代理对象,代理方法,目标对象,目标方法,还提到了,代理方法可以在目标方法的基础上添加一些代码,代理方法最终还是要调用目标对象的目标方法。
在学习 Java 基础时,并没有学习到 JDK 动态代理相关的内容,这里就把课给补上。
另外,老杜在追 @Param 的源码时,也涉及到了 MyBatis 接口代理机制一些相关源码的细节,因此在研究完 JDK 动态代理之后,再回过头来看看 MyBatis 的接口动态代理的实现细节,追一遍 MyBatis 接口代理的源码。
静态代理和动态代理MyBatis 接口代理机制底层是使用 Java 动态代理技术实现的,建议先了解 Java 动态代理相关知识,可以阅读:
Java 动态代理作用是什么? - 知乎
动态代理大揭秘,带你彻底弄清楚动态代理!
代理机制/代理模式下,不论是静态代理还是动态代理,都存在这些概念:代理对象,代理方法,目标对象,目标方法。下面先以静态代理为例,说明这些概念的含义。
JD ...
MyBatis 中接口代理机制及使用 - sqlSession.getMapper() 的使用问题
MyBatis 中接口代理机制及使用 - sqlSession.getMapper() 的使用问题写在前面做该笔记时,我还不了解 Java 的动态代理技术,也没有系统地追一遍 sqlSession.getMapper() 以及 mapper 调用接口方法的底层源码。
如果已经了解这些知识,就明白接口代理类 mapper 本质上是对 sqlSession 进行代理,sqlSession 就是目标对象,诸如 sqlSession.insert() 之类的方法就是目标方法。
由于 sqlSession 存在线程安全的问题,自然对其进行代理的接口代理类 mapper 也会存在线程安全的问题,毕竟代理方法底层还是需要调用目标对象的目标方法。这就把问题从根本上解释清楚了,而不是像下文这样解释得有些隔靴搔痒。
另外,Mybatis 的接口代理机制实际是用 Java 的动态代理技术来实现的,并没有直接使用到 javassist。Mybatis 中内置的 javassist 应该是用在了其他地方。
关于 MyBatis 的接口代理机制的源码分析,补充写了一篇笔记,如果可以的话,建议先阅读源码分析,本笔记 ...
使用 javassist 生成类 - javassist 为什么要把方法的创建和添加分开
使用 javassist 生成类 - javassist 为什么要把方法的创建和添加分开先来看如下代码:
123456789101112131415@Testpublic void testGenerateFirstClass() throws Exception { // 获取类池,类池有两个主要用途:(1) 获取已知类 (2) 制造新类 ClassPool pool = ClassPool.getDefault(); // 制造新类,需要提供全类名 CtClass ctClass = pool.makeClass("com.powernode.bank.dao.impl.AccountDaoImpl"); // 制造方法,第一个参数是方法代码字符串,第二个参数是该方法所属的类 String methodCode = "public void insert() { System.out.println(123); }"; CtMethod ctMethod = CtMeth ...
手写 MyBatis 框架 - GodBatis 实现上的问题与改进
手写 MyBatis 框架 - GodBatis 实现上的问题与改进GodBatis 实现上的问题GodBatis 在事务管理器的实现上存在问题:一个 SqlSessionFactory 只能对应一个 Transaction 事务管理器。如果 SqlSessionFactory.openSession() 开启多次会话,那么每个会话 SqlSession 底层都是使用的同一个事务管理器 Transaction,从而每个会话使用的是同一个 Connection 连接对象。
在 MyBatis 中也有 Transaction 接口,也有 JdbcTransaction 和 ManagedTransaction 两个实现类。
假设事务管理器配置是 <transactionManager type="JDBC"/>,那么每次开启会话 SqlSessionFactory.openSession(),底层就会相应创建一个 JdbcTransaction。因此:
一个 SqlSessionFactory 能够创建多个 SqlSession SQL 会话。
一个 Sq ...
Mybatis 核心配置文件 - 数据源 JNDI 集成第三方数据库连接池
Mybatis 核心配置文件 - 数据源 JNDI 集成第三方数据库连接池建议阅读:
什么是JNDI?
JNDI学习总结(一)——JNDI数据源的配置
JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源
Tomcat——Tomcat数据源的配置(四种方式,区别webapps目录下的Web应用和其他Web应用)
在 Tomcat 中使用 JNDI 可以对数据源进行配置,配置如下:
1234567891011<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/task" username="root" password="123456" ...
ResourceBundle 中文乱码问题解决
ResourceBundle 中文乱码问题解决问题国际化 i18n 中文的配置文件 i18n_zh_CN.properties 内容如下:
12345678910username=用户名password=密码sex=性别age=年龄register=注册boy=男girl=女email=邮箱reset=重置submit=提交
下面 bundle.getString 会输出乱码:
12345678910111213@Testpublic void testI18n() { Locale locale = Locale.CHINA; ResourceBundle bundle = ResourceBundle.getBundle("i18n", locale); // 输出中文会乱码 System.out.println("username: " + bundle.getString("username")); System.out.println("password: " ...
MySQL 杂记
MySQL 笔记自定义函数
MySQL 之自定义函数 | xyZGHio
存储过程
MySQL 存储过程 | 菜鸟教程 (runoob.com)
事务在学习韩顺平的 MySQL 课程时,看到了如下 SQL:
1234567891011121314151617181920-- 创建存储过程 insert_many_emp,用于循环插入大量随机 emp 雇员数据CREATE PROCEDURE insert_many_emp(IN start_id INT, IN call_num INT)BEGIN DECLARE i INT DEFAULT 0; # MySQL 默认开启事务自动提交模式,每条 SOL 语句都会被当做一个单独的事务自动执行 # 因此每插入一条数据,事务即完成,从而都会即刻自动提交一次 # 为了提高效率,这里使用 SET autocommit 语句设置事务的自动提交模式 SET autocommit = 0; REPEAT INSERT INTO emp (empno, ename, job, mgr, hiredate, sal, comm, deptno) V ...
好文收录 - 最熟悉的陌生人,那些关于String你不得不知道的东西
好文收录 - 最熟悉的陌生人,那些关于String你不得不知道的东西
原文地址:最熟悉的陌生人,那些关于String你不得不知道的东西-腾讯云开发者社区-腾讯云 (tencent.com)
老套的笔试题在一些老套的笔试题中,会要你判断s1==s2为false还是true,s1.equals(s2)为false还是true。
1234String s1 = new String("xyz");String s2 = "xyz";System.out.println(s1 == s2);System.out.println(s1.equals(s2));
对于这种题,你总能很快的给出标准答案:==比较的是对象地址,equals方法比较的是真正的字符数组。所以输出的是false和true。
上面的属于最低阶的题目,没有什么难度。
现在这种老套的题目已经慢慢消失了,取而代之的是有一些变形的新题目:
12345678910111213String s1 = "aa";String s2 = "bb";String ...