詳解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的地址都已經不一樣了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM