- 浏览: 82973 次
- 性别:
- 来自: 大连
最新评论
-
magicyang919:
很期待,加油做啊。讲清楚how,和why,更重要的是why,重 ...
原来有关Spring核心部分的源代码分析 -
magicyang919:
这个必须顶,我们要知道的就是为什么spring这么设计,而不是 ...
Spring框架核心源代码的分析及其感受-1 -
pastore123:
分析的很好,思维过程讲的很好,通俗易懂
Spring框架核心源代码的分析及其感受-1 -
gbllty1981:
一个简单的基于约定优于配置(Coc)的对象工厂实现 -
沙舟狼客:
其实在开发中有好多都是固定模式的,所以应该用约定;这样维护起来 ...
约定优于配置的一个思考
文章列表
在上一篇,我们看到这样的代码:
DefaultListableBeanFactory beanFactory = createBeanFactory();
.... synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; }
知道Application将getBean方法的实现委托给了DefaultListableBeanFactory,在DefaultListableBeanFactory按F4键我们可以看到这样的继承结构:
其中XmlBeanFactory我们经常用到, ...
首先,必须先在[/size]Spring源代码中,找到IOC的入口点,也就是IOC的启动点,我们经常用Spring框架,知道ApplicationContext和BeanFactory启动的方式,有很多种,我们先排除Spring Web框架或者Struts2 框架的方式,而是寻找最简单的方式,以便能排除环境的因素而找到最纯的一个实现,而我们在使用Spring最简单的方式是:假设所有的需要配置的类都已经实现完毕,配置文件也写好,那么
ApplaictionContext context=new FileSystemXmlApplicationContextIMyObject Obj=(IMyOb ...
}
else
{
if
(
this
.
logger
.isInfoEnabled()) {
this
.
logger
.info(
"Overriding bean definition for bean '"
+ beanName +
this
.
readerContext
.getRegistry(),
true
);
}
else
{
//
如果
Bean
为空,就在这里注册一个
Class
全局限定名
beanName =
this
.
readerContext
.generateBeanName(beanDefinition);
好了!这里又出现了新的类型
BeanDefinitionParserDelegate
干什么用的?不过我知道这肯定和
XML
解析有关,所以不容错过!于是乎,简单浏览了一下它的实现(怕进入代码丛林!),我的天啊,我找到正题了:
public
class
BeanDefinitionParserDelegate
{
public
static
final
String
BEANS_NAMESPACE_URI
=
"http://www.springframework.or ...
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory); //从这块代码
可以发现XML的解析估计是在这里发生的,也就是这个Reader来读取的,
....
loadBeanDefinitio ...
呵呵,无论从调用关系、方法名称和注释都能敏感的感觉到找对地方了,
prepareRefresh
的注释写“
refreshing”
,真搞不清这个概念,先进去看看:
protected void prepareRefresh() {
this.startupDate = System.currentTimeMillis();
synchronized (this.activeMonitor) {
this.active = true;
}
if (logg ...
(事先用Word写好的,再贴上来,格式有点...,有时间再调整,如果看不清楚,请直接下载我写的Word文档,在-6第六篇文章中,有错别字就别怪我了,没有时间检查)
对于
Java
开发者来说,经常会用到一个框架
—Spring,
但是从用的角度来讲,很多人已经认为比较“复杂”了,但是我认为这个和思维方式有关,当人看到一个电视机,然后看完说明书(相当于
Spring
的用户文档),最后在磕磕碰碰的点击各种按钮后电视机开始工作了,但是他某一天想让电视机能干点说明书描述的东西以外的事情的时候,现在的电视机也就无能为力了,比如他想让电视机能够具备播放
...
我曾经为之服务的一家公司,由于新项目的特点,也为了在公司的方法论资产做一个积累和提高,并且在详细调研了Scrum方法之后,公司老板作出决定,在E-Notebook项目中,开始采用敏捷开发方法,最近有空将其整理出来,做个留 ...
在我不断地从一种技术玩到另外在一种的时候,总是觉得时曾相识,原因很简单,无论你是用C在Linux上搞开发,还是用java/.net等等,都是建立在一个理论体系上,对于JavaEE和.Net则是面对企业级应用市场的时候,它们的共同点就更加多了,比如:在表现层:.Net有ASP.Net,Java有JSP. 但是ASP.net更加”厚“一些,我们可以开发各种服务器端控件,使用和JSP类似的Session、Application等对象模型,我们可以重载Page类或者Control中的方法来管理ASP.net page或者控件的声明周期,我们可以使用监听器来管理JSP的生命周期,JSP可以使用标签库来展现 ...
我的笔记本是Thinkpad T410,配置如下:
CPU i5 540 2.83 GHZ
Mem:6GB
Disk:320G 7200 RPM
Display:NVS 3100m
下载了一个ubuntu 64bit DVD iso http://www.ubuntu.com/desktop
刻录成光盘,然后用此光盘启动Thinkpad.
进入画面后,选择中文,然后按提示操作。 ...
锁
锁是用来锁东西的,让别人打不开也看不到!在线程中,用这个“锁”隐喻来说明一个线程在“操作”一个目标(如一个变量)的时候,如果变量是被锁住的,那么其他线程就对这个目标既“操作”不了(挂起)也无法看到目标的内容!对Java并发包,锁的实现基本在java.util.concurrent.locks包中,说“基本”是因为,在java.util.concurrent中还有CountDownLatch(可以看成带计数器的锁),CyclicBarrier,Semaphore(类似于信号量,但是也可以看成一个特殊的锁)。这里我们先以java.util.concurrent.locks包为主来讨论锁的问题吧 ...
Exchanger
Exchanger 类方便了两个共同操作线程之间的双向交换; Exchanger 通常用于一个线程填充缓冲,而另一个线程清空缓冲的情况。当两个线程在屏障处集合时(交换点),它们交换缓冲,为了解释Exchanger的使用方法,先看看其实现原理,在Exchanger中最核心的方法是exchange, 其JDK的实现是:
public V exchange(V x) throws InterruptedException {
if (!Thread.interrupted()) {
Object v = doExchange(x = ...
我们现在来看看CompletionService :
package ExecutorDemos;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import ja ...
前面文章用直接使用Thread类的start方法来新启动一个线程,看起来貌似没有什么问题,问题就在于线程使用场景的需求上,如果希望每个一段时间自动运行一次这个线程,如果想使用线程池,这个Start方法就完全不够了。
下面我 ...