一、BeanFactory
1.Resource
p85/p88ResourcePatternResolver扩展ResourceLoader接口,定义了一个新的接口方法getResource(String locationPattern),该方法支持带资源类型前缀及Ant风格的资源路径表达式。PathMathingResourcePatternResolver是Spring提供的标准实现类。
2.BeanFactory

p92
Spring为BeanFactory提供了多种实现,最常用的是XmlBeanFactory,但在Spring3.2中已被废弃,建议使用XmlBeanDefinitionReader、DefaultListableBeanFactory代替。
(下图描述了Spring容器从加载配置文件到创建出一个完整Bean的作业流程及参与的角色)
XmlBeanDefinitionReader实现了BeanDefinitionReader接口,XmlBeanDefinitionReader解析配置信息,根据配置文件实例化BeanFactory。
(下面是BeanFactory,DefinitionReader, Resource的关系类图)
public class TestBeanFactory {
private static BeanDefinitionReader reader;
private static ResourceLoader resourceLoader;
private static BeanFactory factory;
private static Resource resource;
@BeforeClass
public void setUp() {
resourceLoader = new PathMatchingResourcePatternResolver();
resource = resourceLoader.getResource("classpath:com/smart/beanfactory/beans.xml");
factory = new DefaultListableBeanFactory();
reader = new XmlBeanDefinitionReader((DefaultListableBeanFactory)factory);
reader.loadBeanDefinitions(resource);
}
@Test
public void test() {
Car car = (Car) factory.getBean("car");
car.introduce();
}
}
二、ApplicationContext
AplicationContext的主要实现类是ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件。
可以指定一组配置文件,Spring会自动将多个配置文件在内存中“整合”成一个配置文件:
ApplicationContext ctx = new ClassPathApplicationContext( new String[]{"conf/beans1.xml", "conf/beans2.xml"});
ApplicationContext 的初始化和 BeanFactory有一个重大的区别:
BeanFactory在初始化容器时,并未实例化 Bean, 知道第一次访问某个Bean时才实例化目标Bean;而ApplicationContext的初始化时间会比BeanFactory稍长一些,不过稍后的调用则没有“第一次惩罚”的问题。
public class TestApplicationContext {
private static ApplicationContext context;
@Test
public void test() {
//1.
context = new ClassPathXmlApplicationContext("com/smart/context/beans.xml");
//2.
// context = new FileSystemXmlApplicationContext("D:/E/masterSpring/code/chapter4/com/smart/context/beans.xml");
Car car = (Car) context.getBean("car");
car.introduce();
//3.
context = new AnnotationConfigApplicationContext(TestBeans.class);
car = (Car) context.getBean("car");
car.introduce();
//4.
context = new GenericGroovyApplicationContext("classpath:com/smart/context/groovy-beans.groovy");
car = (Car) context.getBean("car");
car.introduce();
}
}
//TestBeans.java
@Configuration
public class TestBeans {
@Bean(name = "car")
public Car buildCar() {
Car car = new Car();
car.setBrand("红旗CA72");
car.setMaxSpeed(210);
return car;
}
}
//groovy-beans.groovy
import com.smart.Car
beans {
car(Car) { //1.名字/类型
brand = "红旗86";
maxSpeed = 220;
color = "white";
}
}