详解ApplicationContext

ApplicationContext

ApplicationContext和BeanFactory非常的相似,都是用来生产bean的,但是Application是继承于BeanFactory,所以ApplicationContext更加强大,比如有读取系统变量、发布、国际化。

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
    String getId();

    String getApplicationName();

    String getDisplayName();

    long getStartupDate();

    ApplicationContext getParent();

    AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;
}

可以看到ApplicationContext继承了很多接口。


ListableBeanFactory, HierarchicalBeanFactory:继承与BeanFactory

EnvironmentCapable:系统环境相关接口
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext();
        System.out.println(annotationConfigApplicationContext.getEnvironment().getSystemEnvironment());

 

MessageSource:国际化相关接口
ApplicationEventPublisher:事件发布相关接口
ResourcePatternResolver:资源匹配、解析相关功能

 

 

 通过查看实现类,我们能看到他有好多,这边只是一部分。然后我仔细讲解比较重要的实现类,分别为AnnotationConfigApplicationContext、ClassPathXmlApplicationContext、FileSystemXmlApplicationContext。并且对实现类可以按两种类别进行区分,分别是1.可不可以刷新  2.Spring配置的展现形式xml、注解

 

1》ClassPathXmlApplicationContext是通过读取target目录下面生成的spring.xml,而FileSystemXmlApplicationContext 是读取该项目的相对路径中的spring.xml

        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
        System.out.println(classPathXmlApplicationContext.getBean("user"));

        FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("src/main/resources/spring.xml");
        System.out.println(fileSystemXmlApplicationContext.getBean("user"));

2》AnnotationConfigApplicationContext是直接将类名传入,如果加了@ComponentScan,其实将User类加入@Component就行。如果不加扫描,那在Config类里面,想要注入的Bean用@Bean注解进行注入

        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class);
@ComponentScan("wxy")
public class Config {
    @Bean
    public User user(){
        return new User();
    }
}

 

可以不可以刷新,就是如果支持刷新,ApplicationContext会将容器里面的bean全部销毁,然后重新生成bean

public abstract class AbstractXmlApplicationContext extends AbstractRefreshableConfigApplicationContext

public abstract class AbstractXmlApplicationContext extends AbstractRefreshableConfigApplicationContext {

 

 

1》可以看出来ClassPathXmlApplicationContext、FileSystemXmlApplicationContext都是集成于AbstractRefreshableConfigApplicationContext,所以他们来是支持刷新的,而AnnotationConfigApplicationContext是不支持的。

 

        FileSystemXmlApplicationContext fileSystemXmlApplicationContext = new FileSystemXmlApplicationContext("src/main/resources/spring.xml");
        System.out.println(fileSystemXmlApplicationContext.getBean("user"));//wxy.User@49993335
        fileSystemXmlApplicationContext.refresh();
        System.out.println(fileSystemXmlApplicationContext.getBean("user"));//wxy.User@66480dd7

可以看出来刷新后的user的地址都已经不一样了。

 
posted @ 2022-02-12 22:28  WXY_WXY  阅读(1219)  评论(0编辑  收藏  举报