10-Spring Transactional事务
1. 目录[TOC] 2. 说明@Transactional为spring提供的申明式事务管理,开发者可以很快速的开启事务,同时,其自带了事务管理,可以在事务结束时自行提交或回滚,大大减少了程序编码,同时也避免了IO连接泄露同时,@Transactional 还提供了传播特性和隔离级别,更好的扩展了程序中可能出现的场景 3. 依赖分析4. 源码分析4.1. 自动配置事务管理器spring项目中需要在xml文件中配置事务管理器,而springboot中通过@EnableTransactionManagement来开启事务生效,新版本中已经不需要@EnableTransactionManagement了,直接通过TransactionAutoConfiguration类来进行自动配置,注入需要的类。 4.1.1. 加载TransactionAutoConfigurationspringboot自动化配置会扫描配置的configuration,加载主要为spring...
4 sql关键字用法
usingusing等价于join操作中的on,然后匹配两张表的相同字段;例如a和b根据id字段关联,那么以下等价using(id) <-> on a.id=b.id如以下2个实例等价: 123select a.name,b.age from t_1 as a join t_2 as b on a.id=b.id等价于select a.name,b.age from t_1 as a join t_2 as b using(id) 还可以根据多值相等,如 123select a.name,b.age from t_1 as a join t_2 as b on a.id=b.id and a.name=b.name等价于select a.name,b.age from t_1 as a join t_2 as b using(id,name) with as12345with as temp_name_a( -- 这里就是查询回来一个临时表 select col_a,col_b,col_c from a inner join b on...
NIO模型
1. 说明NIO主要包括 Selector Channel Buffer 三部分 Buffer 缓冲区,实际上为一块内存 Channel 通道,为数据链接的载体 Selector 选择器,NIO主要的协调者,通过对SelectorKey的轮询实现对不同订阅的调用处理 具体详见Java NIO (图解+秒懂+史上最全) 已经说的很细了Java面试常考的 BIO,NIO,AIO 总结() 后续主要提供一个简单的演示,实际要复杂的多 2. 缓冲区以Intbuffer为例 123456789101112131415161718@Testpublic void intBuffer(){ //创建缓冲区 IntBuffer intBuffer = IntBuffer.allocate(10); //写数据 for (int i = 0; i < 10; i++) { intBuffer.put(i); } //翻转 需要注意的是翻转了也可以写的,但是会挨个儿覆盖数据 ...
9-Spring AOP动态代理分析
1. 目录[TOC] 2. 说明AOP动态代理是在bean初始化的过程中,在两个地方执行 doCreateBean()->initializeBean()->applyBeanPostProcessorsAfterInitialization()后处理中执行 添加Bean到singletonFactories时创建的匿名内部类中。调用的时候是在doGetBean()中的getSingleton方法,执行内部类方法getEarlyBeanReference() 两个地方的处理类均为AnnotationAwareAspectJAutoProxyCreator,将原来的bean通过动态代理解析成代理之后的bean 3. 依赖分析4. 源码分析1234567891011@Overridepublic Object postProcessAfterInitialization(@Nullable Object bean, String beanName) { if (bean != null) { Object cacheKey =...
8-Spring循环依赖的处理逻辑
1. 目录[TOC] 2. 说明spring 解决循环依赖主要用到三层缓存,即singletonObjects、earlySingletonObjects、singletonFactories三个缓存,此三个缓存是三个Map作为DefaultSingletonBeanRegistry的成员属性 singletonObjects类型是ConcurrentHashMap earlySingletonObjects类型是ConcurrentHashMap singletonFactories类型是HashMap 3. 依赖分析 DefaultSingletonBeanRegistry...
7-Spring初始化单例Bean-createBean中的扩展接口
1. InstantiationAwareBeanPostProcessor1234567891011121314151617181920212223242526272829303132333435363738394041public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { @Nullable //在createBean() -> resolveBeforeInstantiation() 下调用, // 与resolveBeforeInstantiation配合所有postProcessBeforeInstantiation调用完成之后调用postProcessAfterInitialization default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { return...
6-Spring初始化单例Bean-createBean
1. 目录[TOC] 2. 说明初始化bean的过程一般是放在getBean的匿名内部类创建中,一般不主动调起 3. 依赖分析DefaultListableBeanFactory的创建bean的方法主要依赖AbstractAutowireCapableBeanFactory, 4. 源码分析这里主要分析AbstractAutowireCapableBeanFactory 4.1. createBean()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960// AbstractAutowireCapableBeanFactory@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException...
eureka服务搭建
EurekaServer搭建pom依赖123456789101112131415161718192021222324252627282930<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> ...
5-Spring 初始化单例Bean-getBean
1. 目录[TOC] 2. 说明前面ApplicationContex刷新流程中我们已经走到了beanFactory.preInstantiateSingletons(),初始化单例bean依赖于解析得到的BeanDefinition,且这是容器最后一步复杂的操作了 这里需要提一下,前面与Bean生命周期相关的BeanPostPocessor已经出初始化成了Bean,因为这涉及到全局的,因此提前初始化,这里需要初始化的都是一般的Bean了 3. 依赖关系DefaultlistableBeanFactory初始化单例主要逻辑是在AbstractBeanFactory中,其依赖关系如下图: AbstractBeanFactory在这里继承了DefalultSingletonBeanRegistry,DefalultSingletonBeanRegistry主要维护了单例bean的三级缓存逻辑 4. 源码解析4.1. DefaultListableBeanFactory#preInstantiateSingletons()...
4-Spring 注解扫描BeanDefinition
1. 目录[TOC] 2. 说明在基于xml的spring项目中,前面分析BeanDefinition加载中已经说到,解析代码中的注解@Component需要在配置文件中配置<context:component-scan/>,然后在解析标签时扫描包中的注解,并加入BeanDefinition中。 3. 依赖关系4. 源码解析源码解析从获取ContextNameSpaceHandler开始 4.1. ContextNameSpaceHandler 来源XmlReaderContext创建时会传入NamespaceHandlerResolver,NamespaceHandlerResolver便含有ContextNameSpaceHandler,代码如下 123456789public XmlReaderContext( Resource resource, ProblemReporter problemReporter, ReaderEventListener eventListener, SourceExtractor...