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