- 浏览: 87369 次
- 性别:
- 来自: 西安
最新评论
-
xuhang1128:
good
Spring源码解析 BeanPostProcessor的实现 -
zhudaokun:
呵呵……好帖,收藏一下
Spring源码解析1 IOC容器的初始化
文章列表
默认情况下会在容器启动时初始化bean, 但是我们可以指定Bean节点的 lazy-init="true" 来延迟初始化bean,这时候,只有第一次获取bean才会初始化bean。在IoC容器的初始化过程中,主要的工作是对BeanDefinition的资源定位,载入,解析和注册。此时依赖注入并没有发生,依赖注入发生在应用第一次向容器所要Bean时。对于容器的初始化有另外一种情况,就是用户可以通过设置Bean的lazy-init属性来控制预实例化的过程,这个预实例化在容器初始化时就完成了依赖注入。
在refresh中调用的finishBeanFactoryInitial ...
当IoC容器的初始化完毕后,我们就要接触IoC容器的核心功能:依赖注入
在基本的IoC容器接口BeanFactory中,有一个getBean的接口方法的定义,这个接口的实现就是触发依赖注入发生的地方。我们从DefaultListableBeanFactory的基类AbstractBeanFactory入手了解getBean()的实现:
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
这里的getBean接口方法 ...
上一次我们了解BeanDefinition的在载入和解析,现在我们来看一下BeanDefinition的注册过程:
当BeanDefinition在IoC容器中载入和解析完成后,用户定义的BeanDefinition信息已经在IoC容器内建立起了自己的数据结构以及相应的数据表示,在Default
ListableBeanFactory中通过一个HashMap来持有载入的BeanDefinition。
DefaultBeanDefinitionDocumentReader
private
前面我们分析了:IoC容器的第一个步骤BeanDefinition的Resource定位,接下我们分析BeanDefinition的载入和解析。我们先总的描述一下的BeanDefinition的载入和解析:
BeanDefinition的载入过程包括两部分,首先是通过调用XML的解析器得到Document对象,但这些Document对象并没有按照Spring的Bean规则进行解析。
按照Spring的Bean规则进行解析过程是在DocumentReader中实现的。这里使用默认设置好的DefaultBeanDefinitionDocumentReader。然后再完成对BeanDefiniti ...
参考《Spring技术内幕》一书:
IoC容器的基本接口是由BeanFactory来定义的,也就是说BeanFactory定义了IoC容器的最基本的形式,并且提供了 IoC容器所应该遵守的最基本的服务契约。BeanFactory只是一个接口类,并没有给出容器的具体实现。DefaultListableBeanFactory,XmlBeanFactory,ApplicationContext,FileSystemXmlBeanFactory,ClassPathXmlBeanFactory都实现了BeanFactory接口并且扩展了IoC容器的功能。
首先介绍BeanFactory:
...
内核模块是Linux内核向外部提供的一个插口,其全称为动态可加载内核模块(Loadable Kernel Module,LKM),我们简称为模块。模块具有以下特点:
1 模块本身不被编译入内核映像,从而控制了内核的大小
2 模块一旦被加载,它就和内核中的其他部分一样
一、 什么是模块
模块是具有独立功能的程序,它可以被单独编译,但不能独立运行。它在运行时被链接到内核作为内核的一部分在内核空间运行,这与运行在用户空间的进程是不同的。模块通常由一组函数和数据结构组成,用来实现一种文件系统、一个驱动程序或其他内核上层的功能。
首先编写hello.c文件
#include<lin ...
linux2.6内核的配置系统由以下3个部分组成:
Makefile 定义linux内核的编译规则
配置文件Kconfig :给用户提供配置选择的功能
配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面
linux内核中增加程序需要完成以下3项工作:
将编写的源代码复制到linux内核源代码的相应目录。
在目录的Kconfig文件中增加新源代码对应项目的编译配置选项。
在目录的Makefile文件中增加对新源代码的编译条目。
Makefile文集是整个内核工程编译命令的集合。它根据配置情况,构造出需要编译的内核源码文件列表,然后分别编译,并把 ...
参考《Spring高级程序设计》
引入是Spring提供的AOP功能的重要组成部分。使用引入可以动态地在现有的对象中添加新的功能。当我们在现有的对象中添加的功能是一个横切关注点而用传统的面向对象方法难以实现时,我们就可以利用引入动态的添加该功能了。
Spring文档中列举了两个典型的引入用法:对象锁定和对象篡改检测。
我们主要对对象篡改检测进行分析:
现在我们构建一个统计信息收集框架。篡改检测的逻辑被封装在CallTracker接口中,他的一个实现连同自动篡改检测的拦截逻辑被一起引入到合适的对象中。
CallTracker接口
package com.spring. ...
package com.spring.ch04;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
...
lish.h定义双向循环链表的的相关操作。具体的源码分析网上有很多,而且你自己通过阅读注释也可以看懂每个函数的具体功能。接下来就是list.h文件的运用:
由于list.h属于内核模块中的库文件(usr\src\linux-headers-version\include\linux\
而默认加载的是usr\include\下的库文件,不包含list.h
因此需要自己写一个库文件其中包含list.h中的函数
mylist.h
#ifndef _LINUX_LIST_H
#define _LINUX_LIST_H
#include <linux/stddef.h ...
代码实现
package net.mindview.util;
import java.util.*;
public class Sets {
public static <T> Set<T> union(Set<T> a,Set<T> b){
Set<T> result=new HashSet<T>(a);
result.addAll(b);
return result;
}
public static <T> Set<T> intersection(Set< ...
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列 ...
添加一组元素
package com.day1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class AddingGroups {
/**
* 添加一组元素
*/
public static void main(String[] args) {
//Arrays此类包含用来操作数组(比如排序和搜索)的各种 ...
package com.io;
import java.io.*;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
public class GZIPcompress {
/**
* 用GZIP进行简单压缩
* 直接将输出流封装成GZIPOutputStream或ZIPOutputStream,并将输入流封装成
* GZIPInputStream或ZIPInputStream即可
* @throws IOException
*/
publi ...
package com.io;
import java.io.*;
import java.nio.channels.FileLock;
import java.util.concurrent.TimeUnit;
public class FileLocking {
/**
* 文件加锁,Java的文件加锁直接映射到了本地操作系统的加锁工具
* @throws FileNotFoundException
* @throws Exception
*/
public static void main(String[] args) throws File ...