- 浏览: 17484 次
文章列表
Builder模式适合于属性比较多的对象,避免不停调用set方法进行属性注入。核心思想是在外部类中提供一个静态方法构建一个内部类的对象,再通过使用静态的内部类构建外部类对象。缺点是内部类和外部类几乎拥有相同的属性。
里面的关键点:
(1)外部类的builder方法创建内部类
(2)静态内部类
(3)内部类的append方法
(4)内部类的build方法,得到外部类的对象,构建完成
例子:
@Value
public final class StatisticsLoggerInfo {
private final String description;
...
1 普通Bean的创建
spring 中的普通bean的创建是通过读取配置文件,将所有配置文件信息保存到beandefinition中,在使用getbean的时候通过反射创建实例,然后再将属性值填充。
1.1 普通bean的注入方式
1) 使用构造器注入
<bean id="person" class="framework.spring.test.Person">
<constructor-arg index="0" value="1"/&g ...
(1)变量定义的先后顺序决定初始化顺序,即使变量定义散布在方法定义之间,他们仍旧会在方法被调用之前得到初始化,构造方法也是特殊的方法
(2)执行顺序:静态块, 静态变量,非静态变量,构造方法
每次在创建对象的时候非静态变量都会被初始化
静态对象只会在类加载的时候被初始化一次
public class Initialization {
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
@Test
public void test( ...
(1) 直接加载,无论是否需要,只要类被虚拟机加载,这个单例就存在
private static DirectSingleton directSingleton = new DirectSingleton();
public static DirectSingleton getInstance() {
return directSingleton;
}
}
这种方法的缺点是无法实现延迟加载,如果单例的创建过程很慢,而这个类除了创建单例以外还做了别的事情的话,可能导致所有用到这个单例类的地方都在创建单例而不管这个单例对象是否被用到。
(2) ...
转自:http://uule.iteye.com/blog/2094549
BeanPostProcessorBeanPostProcessor接口作用是:如果我们需要在Spring容器完成Bean的实例化、配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcessor接口的实现,然后注册到容器中。BeanPostProcessor接口定义如下:public interface BeanPostProcessor {/*** Apply this BeanPostProcessor to the given new bean instance b ...
1、使用方式-使用ApplicationContext方式加载XML
@Test
public void testBeanLoader(){
BeanFactory bf = new ClassPathXmlApplicationContext("configuration/spring-test.xml");
}
2、解析ClassPathXmlApplicationContext构造函数:
public ClassPathXmlApplicationContext(String[] configLocations, boolean ...
1、装载bean的第一步,调用doGetBean(name,...)方法
(1)转换对应的beanName,参数里面的name未必是beanName,可能是别名或者factoryBean
(2)首先尝试从缓存中加载单例
(3)如果从缓存中拿到了bean,调用getObjectForBeanInstance 将bean实例化
(4)原型模式依赖检查
(5)通过getParentBeanFactory获取parentBeanFactory
(6)获取RootBeanDefinition
(7)针对不同的scope进行bean的创建
(8)类型转换
2、从缓存中获取单例 ...
HahMap什么时候扩容呢?
(1)当map中k-v总数即下面的size大于threshold 的时候
if (++size > threshold)
resize();
(2)
table=null或者table.length =0
threshold 是个什么?
HahMap在初始化的时候给threshold的赋值:
this.threshold = tableSizeFor(initialCapacity);
//下面的方法用于找到>=cap的最小的2的幂
static final int tableSi ...
转自:http://www.importnew.com/20386.html
简介
Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:
下面针对各个实现类的特点做一些说明:
(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时 ...
HashMap中的域
(1) transient Node<K,V>[] table;//存储node的数组
(2)threshold:
(3)static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 默认map中table数组的大小
(3)static final float DEFAULT_LOAD_FACTOR = 0.75f;//负载因子,当map中 ...
本文属于作者原创,原文发表于InfoQ:http://www.infoq.com/cn/articles/ftf-java-volatile
从并发编程网上转来,mark一下,好好学习
http://ifeve.com/volatile/
引言
在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小,本文将深入分析在硬件层面上In ...
通常在需要使用数据集合的时候,枚举便派上了用场。大多数情况下使用枚举的时候无意识的不会去修改里面的值。那么枚举中的值到底能不能修改呢? 答案是:一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要 ...
(1)对象作为参数执行插入
<insert id="insert" parameterType="Person">
insert ignore into tb_person_${tbIndex} (uid,name )
values(#{person.uid,jdbcType=INTEGER},#{person.name,jdbcType=VARCHAR})
</insert>
此时,如果表中有和属性对应的id字段,在插入动作返回后,会同时将自增主键写入id
(2)当不以对 ...
spring bean的解析及创建过程:(1)元数据层(xml anotation )(2)逻辑定义层(解析元素,将结果汇总到beandefination,定义对象初始化逻辑和依赖关系,发生在Beanfactory初始化时候)
(3)应用层(bean加载 将bean初始化成对象,发生在getBean时候)1、元数据到BeanDefination的解析过程DefaultListableFactory 的registerBeanDefinition方法将从xml中解析的beanName和beanDefinition(GenericBeanDefinition)注册到一个在内存中的map:be ...