BeanFactory和ApplicationContext两种方式配置Spring

一、BeanFactory

1.Resource

p85/p88
为了访问不同类型的资源,必须使用相应的Resource 实现类,这是比较麻烦的,是否可以在不显示使用Resource实现类的情况下,仅通过资源地址的特殊标识就可以访问相应的资源呢?


ResourcePatternResolver扩展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";
    }
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值