详解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的地址都已经不一样了。