GuangchaoSun's Blog


  • 首页

  • 分类

  • 归档

  • 标签

  • 书单

  • 关于

  • 公益404
GuangchaoSun's Blog

Spring源码解析-容器功能的扩展

发表于 2019-05-19  |  2019-05-19   |   分类于 Spring   |  

#概述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/** Synchronization monitor for the "refresh" and "destroy" */
//refresh(),close(),registerShutdownHook()方法
private final Object startupShutdownMonitor = new Object();
@Override
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// Prepare this context for refreshing.
/**
* 表示真正做refresh之前需要做的事情:
* 1. 设置Spring容器的启动时间,撤销关闭状态,开启活跃状态
* 2. 初始化property
* 3. 验证环境信息里必须存在的属性
*/
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
// 主要是解析我们项目配置的application.xml、xxx.xml 定义的import、bean、resource、profile等
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
/**
* 对beanFactory进行相关设置,为后续的使用做准备
*/
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
/**
* 子类覆盖方法做额外的处理
* BeanFactory设置之后再进行后续的一些BeanFactory操作
* 不同的Spring容器做不同的操作。比如GenericWebApplicationContext容器会在BeanFactory中添加
* ServletContextAwareProcessor用于处理ServletContextAware类型的bean初始化的时候调用
* setServletContext或者setServletConfig方法
* (跟ApplicationContextAwareProcessor原理一样)
*/
postProcessBeanFactory(beanFactory);
/**
* Invoke factory processors registered as beans in the context.
* 激活各种BeanFactory处理器
*/、
invokeBeanFactoryPostProcessors(beanFactory);
/**
* Register bean processors that intercept bean creation.
* 注册拦截 Bean 创建的 Bean 处理器,这里只是注册,真正的调用是在 getBean 时候
*/
registerBeanPostProcessors(beanFactory);
/* 为上下文初始化 Message 源,即不同语言的消息体,国际化处理
* Initialize message source for this context.
*/
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
阅读全文 »
GuangchaoSun's Blog

jvm调优常用命令

发表于 2018-05-14  |  2018-05-22   |  

获取JVM设置默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[ccag@devtbcwas ~]$ java-XX:+PrintFlagsFinal -version|grep -i HeapSize
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 262144000 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize :=4164943872 {product}
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build25.151-b12, mixed mode)
阅读全文 »
GuangchaoSun's Blog

TCP三次握手和四次挥手

发表于 2018-04-11  |  2018-04-15   |   分类于 网络编程   |  

TCP提供一种面向连接的可靠的字节流服务

TCP报文格式

img

  1. 序号:seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发送方发送数据时对此进行标记
  2. 确认序号:ack序号,占32位,只有ACK标志位为1是,确认序号字段才有效,ack = seq + 1;
  3. 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下:
    1. URG-紧急指针(urgent pointer)有效
    2. ACK-确认序号有效
    3. PSH-接收方应该尽快将这个报文交给应用层
    4. RST-重置连接
    5. SYN-发起一个新连接
    6. PIN-释放一个连接
阅读全文 »
GuangchaoSun's Blog

由阿里Java开发手册学习创建线程池的正确方式

发表于 2018-02-07  |  2018-02-07   |  

最近公司里要求使用ecplise上的阿里代码扫描插件来扫描代码,自己装上后看了下,问题还挺多的。其中Blocker的大多数都明白,只是有一条报错很有疑惑:

1
Executors.newFixedThreadPool(nThreads)

这是我创建线程池常用的方法,设置线程池了的上限,难道有什么问题吗?

阅读全文 »
GuangchaoSun's Blog

Java并发性与多线程

发表于 2018-01-12  |  2018-02-07   |   分类于 并发与多线程   |  

多线程的代价

  • 设计更复杂:
  • 上下文切换的开销:
    • 上下文切换(context switch):当CPU从执行一个线程切换到另一个线程的时候,它需要首先存储当前线程的本地数据,程序指针等,然后载入另一个线程的本地数据,程序指针等。最后才开始执行
  • 增加资源消耗:

启动线程的顺序可以是有序的,但执行的顺序并非是有序的。这是因为线程是并行执行而非顺序的。JVM和操作系统一起决定了线程的执行顺序,它和线程的启动顺序并非一定是一致的。

阅读全文 »
GuangchaoSun's Blog

Java线程内存模型-如何保证线程安全

发表于 2017-12-28  |  2018-01-12   |   分类于 转载   |  

volatile

volatile要求程序对变量的每次修改,都写回主内存,读变量是从主内存中读取,这样便对其他线程可见,解决了可见性问题,但是不能保证数据的一致性;特别注意,原子操作:根据Java规范,对于基本类型的赋值或者返回操作,是原子操作。但这里的基本数据类型不包括long和double,因为JVM看到的基本存储单位是32位,而long和double是64位。所以无法在一个时钟周期内完成。

通俗的讲一个对象的状态就是它的数据,存储在状态变量中,比如实力域或者静态域;无论何时,只要多于一个的线程访问给定的状态变量。而且其中某个线程会写入该变量,此时必须使用同步来协调线程对该变量的访问。

阅读全文 »
GuangchaoSun's Blog

Java线程内存模型-工作内存和主内存

发表于 2017-12-28  |  2017-12-29   |   分类于 转载   |  

Java线程内存模型

  • 工作内存:即java线程的本地内存,是单独给某个线程分配的,存储局部变量等,同时也会复制主内存的共享变量到本地内存作为副本,目的是为了减少和主内存的通信频率,提高效率。
  • 主内存:存储类成员变量等,所有的线程共享主内存,每个线程都有自己的工作内存
阅读全文 »
GuangchaoSun's Blog

Oracle新建表空间及用户

发表于 2017-12-05  |  2017-12-05   |   分类于 SQL   |  

oracle 基本命令:

启动数据库服务和监听器

1
2
net start OracleXETNSListener
net start OracleServiceXE

登录,修改密码

1
2
sqlplus / as sysdba
alter user sys identified by password;

阅读全文 »
GuangchaoSun's Blog

JDK1.8在CentOS7中的安装与配置

发表于 2017-10-25  |  2017-10-25   |  

JDK1.8在CentOS7中的安装与配置
环境配置:

  • 虚拟机CentOS-7-x86_64-DVD-1708
  • jdk-8u151-linux-x64.tar.gz

卸载过程

因为卸载软件需要root用户的权限,所以需要先切换到root用户:

1
su root

输入密码就可以切换到root用户。
因为我在安装系统时选择了基本的开发环境,因此系统中已经有JDK了,不过为了体验这个安装过程,我选择先卸载掉:
1.终端输入:

1
2
3
4
5
[root@localhost sunguangchao]# rpm -qa | grep java-1
java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64
java-1.7.0-openjdk-headless-1.7.0.141-2.6.10.5.el7.x86_64
java-1.8.0-openjdk-headless-1.8.0.131-11.b12.el7.x86_64
java-1.7.0-openjdk-1.7.0.141-2.6.10.5.el7.x86_64

阅读全文 »
GuangchaoSun's Blog

NIO学习笔记

发表于 2017-10-21  |  2017-10-21   |   分类于 NIO   |  

普通IO使用流的方式使用I/O。所有I/O都被视为单个的字节的移动,通过一个称为Stream的对象一次移动一个字节。流I/O用于与外部世界接触。它也在内部使用,用于将对象转换为字节,然后再转换为对象。
NIO以块的方式处理数据。

通道和缓冲区

通道(Channel)和缓冲区(Buffer)是NIO中的核心对象,几乎在每一个I/O中都要操作他们。
通道是对原I/O包中的流的模拟。到任何目的地的所有数据都必须通过一个Channel对象。一个Buffer实质上是一个容器对象。发送给一个通道的对象都必须首先放入到缓冲区中;同样地,从通道中读取的任何数据都要读到缓冲区中。

阅读全文 »
12…6
GuangchaoSun

GuangchaoSun

coding change the world

55 日志
19 分类
27 标签
GitHub 知乎 Weibo
© 2019 GuangchaoSun
由 Hexo 强力驱动
主题 - NexT.Muse