Spring-ApplicationContext

来源:互联网 发布:windows小键盘 编辑:程序博客网 时间:2024/05/18 16:19

ApplicationContext介绍

Application由BeanFactory派生而来,提供了更多面向实际应用的功能,在BeanFactory中,很多功能都需要以编程的形式实现,但是在Application中则可以通过配置的方式实现。

ApplicationContext类体系结构
图1
ApplicationContext的主要实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默认从类路径加载配置文件,后者默认从文件系统中装载配置文件。

  • ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器的启动事件、关闭事件等。

  • MessageSource:为应用提供i18N国际化消息访问的功能。

  • ResourcePatternResolver:所有ApplicationContext实现类都实现了类似于PathMatchingResourcePatternResolver的功能,可以通过带前缀的Ant风格的资源文件路径装载Spring的配置文件。

  • LifeCycle:该接口提供start()和stop()方法,主要用于控制异步处理的过程。在具体使用时,该接口同时被ApplicationContext实现及具体Bean实现,ApplicationContext会将start/stop的信息传递给容器中所有实现了该接口的Bean,以达到管理和控制JMX、任务调度等目的。

ConfigurableApplicationContext扩展于ApplicationContext,它新增了两个主要的方法 refresh()和close(),让ApplicationContext具有启动、刷新、关闭应用上下文的能力。在ApplicationContext关闭的情况下调用refresh()即可启动ApplicationContext,在已经启动的状态下调用refresh()则可清除缓存并重新装载配置信息,而调用close()则可关闭ApplicationContext。


初始化ApplicationContext

如果配置文件在类路径下,则使用其ClassPathXmlApplicationContext实现类。

如果配置文件在文件系统的路径下,则使用FileSystemXmlApplicationContext实现类。

Spring支持基于类注解的配置方式,一个标注@Configuration注解的POJO即可提供Spring所需的Bean配置信息,使用类注解的方式,需要使用AnnotationConfigApplicationContext实现类。与XML文件的配置方式相比,这种方式很容易地让开发者控制Bean的初始化过程,更加灵活。

Spring4.0支持Groovy DSL来进行Bean定义配置,其与基于XML文件的配置类似,只不过基于Groovy脚本语言,可以实现复杂、灵活的Bean配置逻辑。使用此种方式,需要使用GenericGroovyApplicationContext实现类。

示例:

图1

XML配置文件

<?xml version="1.0" encoding="UTF-8"?><beans xmlns= "http://www.springframework.org/schema/beans"        xmlns:p="http://www.springframework.org/schema/p"      xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"      xsi:schemaLocation= "          http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">      <bean id="user1" class="com.smart.context.User">        <property name="userName" value="Jack"></property>        <property name="password" value="123"></property>      </bean>      <bean id="user2" class="com.smart.context.User"      p:userName="Lucy"      p:password="123">      </bean></beans>

Groovy脚本

package com.smart.context;beans{    user3(User){          //Bean名称(类型)        userName="Devin"  //注入属性        password="123"    //注入属性    }}

User.java

package com.smart.context;public class User {    private String userName;    private String password;    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    @Override    public String toString() {        return "User [userName=" + userName + ", password=" + password + "]";    }}

Beans.java

package com.smart.context;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;//表示是一个配置信息提供类@Configurationpublic class Beans {    //定义一个Bean    @Bean(name = "user")    public User buildUser() {         User user = new User();         user.setUserName("Jack");         user.setPassword("123");         return user;    }}

AppConfig.java

package com.smart.context;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.context.support.GenericGroovyApplicationContext;public class AppContext {    @Test    public void getBean() {        ApplicationContext context = new AnnotationConfigApplicationContext(Beans.class);        User user = context.getBean("user",User.class);        System.out.println(user.toString());    }    @Test    public void getBean1() {        ApplicationContext context = new ClassPathXmlApplicationContext("config/beans.xml");        User user = context.getBean("user2",User.class);        System.out.println(user.toString());    }    @Test    public void getBean2() {        ApplicationContext context = new GenericGroovyApplicationContext("classpath:config/beans.groovy");        User user = context.getBean("user3",User.class);        System.out.println(user.toString());    }}

ApplicationContext初始化和BeanFactory有一个重大的区别:
BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标而ApplicationContext则在初始化应用上下文时就实例化所有单实例的Bean。因此,ApplicationContext的初始化时间会比BeanFactory要长一些,不过调用时不用实例化那些单实例的Bean,所以快一些。