自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(66)
  • 收藏
  • 关注

原创 JDK动态代理与Cglib代理的深度分析

JDK动态代理与Cglib代理的深度分析一.JDK动态代理原理JDK动态代理首先根据需要代理类的接口、类加载以及handler来生成动态代理类:public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)其中的最主要逻辑是://生成字节码byte[] proxyClassFile = ProxyGenerator.generateProxyCla

2020-11-14 16:59:34 159

原创 Java设计模式总结

Java设计模式总结一.七大原则1.单一职责原则一个类应该只负责一项职责(只有类逻辑足够简单,并且类中数量足够少才可违反)。2.接口隔离原则不应该依赖它不需要的接口,一个类对另外一个类的依赖建立在最小的接口上。3.依赖倒转原则中心思想是面向接口编程。高层模块不应该依赖低层模块,都应该依赖其抽象。抽象(接口,抽象类)不应该依赖细节(具体实现类),细节应该依赖抽象。4.里氏替换原则所有引用基类的地方必须能透明地使用其子类的对象。子类中尽量不要重写父类方法。尽量不要继承,用聚合、组合、依赖

2020-10-31 16:54:14 271 4

原创 Netty组件源码解析(4)

SelectedSelectionKeySet 继承AbstractSet抽象类,已经select的NIO SelectionKey集合final class SelectedSelectionKeySet extends AbstractSet<SelectionKey> { //Selectionkey数组 SelectionKey[] keys; //数组可读大小 int size; SelectedSelectionKeySet() {

2020-07-13 17:26:34 197

原创 Netty组件源码解析(3)

SingleThreadEventLoop 基于单线程的EventLoop抽象类,将Channel注册到EventLoop上public abstract class SingleThreadEventLoop extends SingleThreadEventExecutor implements EventLoop { //默认任务队列最大数量 protected static final int DEFAULT_MAX_PENDING_TASKS = Math.max(16,

2020-07-12 14:25:05 138

原创 Netty组件源码解析(2)

三.EventLoop类图EventExecutor 继承EventExecutorGroup接口,事件执行器接口public interface EventExecutor extends EventExecutorGroup { //返回自己 @Override EventExecutor next(); //当前线程所处的EventExecutorGroup EventExecutorGroup parent(); //当前线程是否在EventLoop线程中

2020-07-10 22:06:12 147

原创 Netty组件源码解析(1)

一.Bootstrap这是Netty中的配置类,也是程序开始的组件。AbstractBootstrap是BootStrap和ServerBootStrap的父类抽象类public abstract class AbstractBootstrap<B extends AbstractBootstrap<B, C>, C extends Channel> implements Cloneable { @SuppressWarnings("unchecked") st

2020-07-10 12:30:16 143

原创 NIO组件源码解析

一.Channelpublic interface Channel extends Closeable { //判断此通道是否处于打开状态 public boolean isOpen(); //关闭此通道 public void close() throws IOException;}四个主要的实现类:1.SocketChannel,客户端发起TCP的Channel//客户端通道,主要两种方式可以创建SocketChannel,一种是打开一个SocketChannel并且连接

2020-07-08 21:55:56 127

原创 Spring事务源码解析(2)

处理已经存在的事务private TransactionStatus handleExistingTransaction( TransactionDefinition definition, Object transaction, boolean debugEnabled) throws TransactionException {//如果是never模式就抛出错误 if (definition.getPropagationBehavior() == TransactionDefinit

2020-07-07 21:00:58 154

原创 Spring事务源码解析(1)

本文主要从注解式配置入手,例如@Transactional(propagation=Propagation.REQUIRED),而分析的逻辑开始部分是在<tx:annotation-driver transaction-manager="transactionManager"/>这是自定义标签实现在TxNamespaceHandler: public void init() { this.registerBeanDefinitionParser("advice",

2020-07-07 16:08:17 124 1

原创 Spring整合Mybatis源码分析

SqlSessionFactoryBean//实现 FactoryBean、InitializingBean、ApplicationListener 接口public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory>, InitializingBean, ApplicationListener<ApplicationEvent> { private static final Lo

2020-07-04 13:40:29 100

原创 MyBatis源码解析--加载流程(11)

接下来分析接口层,首先从SqlSession接口开始:public interface SqlSession extends Closeable { //泛型方法,经过查询返回一个指定的对象 <T> T selectOne(String statement); //根据传入的条件查询结果 <T> T selectOne(String statement, Object parameter); //经过查询,返回泛型集合 <E> List<

2020-07-03 13:59:17 143

原创 MyBatis源码解析--加载流程(10)

//继续DefaultResultSetHandler//创建数据库映射的结果对象private Object createResultObject(ResultSetWrapper rsw, ResultMap resultMap, ResultLoaderMap lazyLoader, String columnPrefix) throws SQLException {//标识是否使用构造函数创建该结果对象 this.useConstructorMappings = false;

2020-07-03 10:18:33 192

原创 MyBatis源码解析--加载流程(9)

ResultSetHandler 会将查询结果的ResultSet转换成映射的对应结果ResultSetWrapperpublic class ResultSetWrapper {//ResultSet对象 private final ResultSet resultSet; private final TypeHandlerRegistry typeHandlerRegistry; //字段名称的数组 private final List<String> columnN

2020-07-03 10:18:15 120

原创 MyBatis源码解析--加载流程(8)

上篇讲完了Executor接口及其实现类,接下来分析StatementHandler,这是Executor用来处理Statement的。首先是StatementHandler的接口public interface StatementHandler { //从连接中获取一个Statement Statement prepare(Connection connection, Integer transactionTimeout) throws SQLException; //占位符

2020-06-27 14:32:10 112

原创 MyBatis源码解析--加载流程(7)

SimpleExecutor前面已经介绍了BaseExecutor,是Executor接口的直接继承,作用是提供模版,为它的继承类可以直接继承方法,其中SimpleExecutor会不需要关心一级缓存的问题,只要实现四个基本方法就可以。public class SimpleExecutor extends BaseExecutor { public SimpleExecutor(Configuration configuration, Transaction transaction) {

2020-06-26 23:12:09 101

原创 MyBatis源码解析--加载流程(6)

BoundSql 一次可执行的SQL封装public class BoundSql {//SQL语句 private final String sql; //ParameterMapping 数组 private final List<ParameterMapping> parameterMappings; //参数对象 private final Object parameterObject; //附加的参数集合 private final Map&lt

2020-06-26 12:57:37 126

原创 MyBatis源码解析--加载流程(5)

StaticTextSqlNode 静态文本的SqlNode实现类public class StaticTextSqlNode implements SqlNode {//静态文本 private final String text; public StaticTextSqlNode(String text) { this.text = text; } @Override //直接拼接到context中 public boolean apply(DynamicCon

2020-06-19 17:24:37 119

原创 MyBatis源码解析--加载流程(4)

接下来是解析sql语句,对应的是scripting包,实现了动态SQL语句的功能。LanguageDriver 语言驱动接口public interface LanguageDriver {//创建ParameterHandler对象 ParameterHandler createParameterHandler(MappedStatement mappedStatement, Object parameterObject, BoundSql boundSql);//创建sqlSource,从

2020-06-19 13:15:37 91

原创 MyBatis源码解析--加载流程(4)

接下来是注解配置的解析,入口是MapperRegistry.addMapperpublic <T> void addMapper(Class<T> type) {//首先判断必须是接口 if (type.isInterface()) { if (hasMapper(type)) { throw new BindingException("Type " + type + " is already known to the MapperRe

2020-06-15 16:52:53 144

原创 MyBatis源码解析--加载流程(3)

MapperBuilderAssistant 继承BaseBuilder抽象类,提供了一些公用的方法public class MapperBuilderAssistant extends BaseBuilder {//当前Mapper命名空间 private String currentNamespace; //资源引用的地址 private final String resource; //当前的Cache对象 private Cache currentCache; //是否

2020-06-15 11:29:34 127

原创 MyBatis源码解析--加载流程(2)

上文分析到解析完mybatis-config.xml,将其中的信息装载进入configuration,并且生成了包含成员变量configuration的实例DefaultSqlSessionFactory。但其中有个还没有解析就是如果mapper使用url或者resource配置的时候,需要先解析对应的mapper.xml以便向mapperRegistry注册mapper。XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, c

2020-06-14 21:05:10 155

原创 MyBatis源码解析--加载流程(1)

分析完11个提供支持的模块,接下来就完整地debug一遍加载的流程。首先看下简单的流程:1.初始化会加载mybatis-config.xml配置文件、mapper映射配置文件以及Mapper接口中的注解信息,这些信息都会形成相应的对象并保存到Configuration中。2.利用Configuration创建SqlSessionFactory对象。3.通过SqlSessionFactory创建SqlSession对象进行相关的数据库操作。那么首先就从加载mybatis-config.xml文件开始

2020-06-14 12:54:16 208

原创 MyBatis源码解析--基础支持层(8)

10.注解模块对应的annotation包,使得我们可以再Mapper接口上编写简单的数据库SQL。CRUD相关的注解:@Insert、@Update、@Delete、@Select 四个最主要的,其次还有@UpdateProvider、@DeleteProvider、@SelectProvider、@InsertProvider、@MapKey、@Options、@SelelctKey、@Param。缓存相关的注解:@CacheNamespace、@Property、@CacheNamespaceR

2020-06-13 21:57:22 127

原创 MyBatis源码解析--基础支持层(7)

TypeAliasRegistry 类型和别名的注册表public class TypeAliasRegistry { private final Map<String, Class<?>> TYPE_ALIASES = new HashMap<>(); public TypeAliasRegistry() { registerAlias("string", String.class); registerAlias("byte", Byt

2020-06-13 14:27:46 85

原创 MyBatis源码解析--基础支持层(6)

7.类型模块对应的是type包 主要功能:1.为了简化配置提供了别名机制 2.实现JDBC类型和Java类型之间的转换首先是TypeHandler接口 类型转换处理器public interface TypeHandler<T> { void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; T getResult(ResultSe

2020-06-13 11:04:26 101

原创 MyBatis源码解析--基础支持层(5)

5.事务模块对应的是transaction包 对数据库中的事务进行了抽象,其自身提供了相应的事务接口和简单实现。很多时候是由spring框架管理事务。Transaction事务接口public interface Transaction {//获得连接 Connection getConnection() throws SQLException; //事务提交 void commit() throws SQLException; //事务回滚 void rollback() th

2020-06-12 12:51:03 79

原创 MyBatis源码解析--基础支持层(4)

三.异常模块对应的是exceptions包,定义了 MyBatis 专有的 PersistenceException 和 TooManyResultsException 异常。除了exceptions包以外,其他包也有定义相应的异常类。IbatisException 一个遗弃的类,IBatis的异常基类@Deprecatedpublic class IbatisException extends RuntimeException { private static final long seri

2020-06-11 17:13:54 206

原创 MyBatis源码解析--基础支持层(3)

MetaObject 提供了对象的属性值的获取与设置等方法,是对BaseWrapper操作的进一步增强public class MetaObject { //原始的java对象 private final Object originalObject; //对对象的包装,抽象了对象的属性信息,他定义了一系列查询对象属性信息的方法,以及更新属性的方法; private final ObjectWrapper objectWrapper; private final ObjectFa

2020-06-11 12:19:41 125

原创 MyBatis源码解析--基础支持层(2)

继续上文中反射模块的解析,下一个类是ReflectorFactorypublic interface ReflectorFactory {//是否缓存Reflector对象 boolean isClassCacheEnabled(); void setClassCacheEnabled(boolean classCacheEnabled);//获取Reflector对象 Reflector findForClass(Class<?> type);}实现类DefaultRe

2020-06-11 09:16:40 131

原创 MyBatis源码解析--基础支持层(1)

一.基础支持层MyBatis的架构可以分为三层,分别是接口层,核心处理层以及基础支持层,按照从下至上的方式先从基础支持层开始,基础支持层具体有:1.解析器模块 2.反射模块 3.异常模块 4.数据源模块 5.事务模块 6.缓存模块 7.类型模块 8.IO模块 9.日志模块 10.注解模块 11.Binding模块1.解析器模块对应的是parsing包,主要有两个功能:1.是对于XPath的封装,为MyBatis初始化时解析mybatis-config.xml提供支持。2.处理动态SQL语句中的占

2020-06-10 16:42:31 161

原创 JDBCTemplate源码阅读

一.save/update功能的实现首先进入jdbcTemplate的update 方法 public int update(String sql, Object[] args, int[] argTypes) throws DataAccessException { return update(sql, newArgTypePreparedStatementSetter(args, argTypes)); } public int update(String sql, @Nullable P

2020-06-09 22:52:33 206

原创 SpringAOP源码阅读笔记

是否支持aop都是由一个配置文件控制的,也就是aop:aspectj-autoproxy。而这配置方式是自定义配置,因此spring需要注册对应的handler和解析器,通过寻找handler发现,在AopNamespaceHandler中有: @Override public void init() { // In 2.0 XSD as well as in 2.1 XSD. registerBeanDefinitionParser("config", new ConfigBeanDefini

2020-06-09 15:04:11 90

原创 SpringIOC源码阅读笔记(11)

5.注册BeanPostProcessor,注意是注册,调用在getbean方法中。 protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); }public static void registerBeanPostP

2020-06-05 13:45:57 68

原创 SpringIOC源码阅读笔记(10)

分析完BeanFactory容器的加载,接下来看一下更复杂的容器ApplicationContext的加载,这个容器也是我们目前使用比较多的容器。跟BeanFactory比起来,ApplicationContext有如下区别:1.继承 MessageSource,提供国际化的标准访问策略。2.继承 ApplicationEventPublisher ,提供强大的事件机制。3.扩展 ResourceLoader,可以用来加载多个 Resource,可以灵活访问不同的资源。4.对 Web 应用的支持。

2020-06-05 12:44:08 149

原创 SpringIOC源码阅读笔记(9)

bean的创建的最后一步是初始化bean:protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) { if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedAction<Object>) () -> {

2020-06-03 13:43:46 81

原创 SpringIOC源码阅读笔记(8)

上文讲到了创建bean总共有4种方法,已经分析了2种,分别是supplier获取以及工厂方法获取,接下来讲第三种:protected BeanWrapper autowireConstructor( String beanName, RootBeanDefinition mbd, @Nullable Constructor<?>[] ctors, @Nullable Object[] explicitArgs) { return new ConstructorResolver(th

2020-06-02 22:48:41 127

原创 SpringIOC源码阅读笔记(7)

创建bean的实现在AbstractAutowireCapableBeanFactory,入口是:@Override protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException { if (logger.isDebugEnabled()) { logger.debug("Creating instanc

2020-06-02 15:36:54 159

原创 SpringIOC源码阅读笔记(6)

从本文开始进行bean的加载过程的解析。同样的我们可以从一行代码开始:MyTestBean bean = (MyTestBean)bf.getBean(“myTestBean”);首先进入AbstractBeanFactory:@Override public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); }代码很长,可以了解获得Bean的主要流程

2020-06-02 10:59:41 98

原创 SpringIOC源码阅读笔记(5)

分析完默认标签的解析,接下来分析自定义标签的解析:方法的入口是在DefaultBeanDefinitionDocumentReader的parseBeanDefinitions方法中,转到parseCustomElement,@Nullable public BeanDefinition parseCustomElement(Element ele) { return parseCustomElement(ele, null); }@Nullable public BeanDefiniti

2020-05-30 12:12:38 94

原创 SpringIOC源码阅读笔记(4)

上文讲到parsePropertySubElement,分析完这个方法,接着在parseBeanDefinitionElement向下分析:public void parsePropertyElements(Element beanEle, BeanDefinition bd) { NodeList nl = beanEle.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i

2020-05-29 23:00:20 140

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除