# 容器实现
# BeanFactory 实现的特点
1 | public class TestBeanFactory { |
beanFactory 不会做的事 :
不会主动调用 beanFactory 后处理器
不会主动添加 Bean 后处理器
不会主动初始化单例
不会解析 beanFactory 还不会解析
${}和#{}
bean 后处理器会有排序的逻辑
# ApplicationContext 实现
ClassPathXmlApplicationContext
1
2
3
4
5
6
7private static void testClassPathXmlApplicationContext() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("b01.xml");
for (String beanDefinitionName : context.getBeanDefinitionNames()) {
System.out.println(beanDefinitionName);
}
System.out.println(context.getBean(Bean2.class).getBean1());
}FileSystemXmlApplicationContext
1
2
3
4
5
6
7private static void testFileSystemXmlApplicationContext() {
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("F:\\java\\study\\spring\\PrincipleOfSpring\\a01\\src\\main\\resources\\b01.xml");
for (String beanDefinitionName : context.getBeanDefinitionNames()) {
System.out.println(beanDefinitionName);
}
System.out.println(context.getBean(Bean2.class).getBean1());
}以上两种实现方式都是将路径转交给 AbstractRefreshableConfigApplicationContext 来实现的
1
2
3
4
5
6
7
8
9
10
11
12
13//读取xml文件之前
System.out.println("读取xml之前============");
for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
System.out.println(beanDefinitionName);
}
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(new ClassPathResource("b01.xml"));
System.out.println("读取xml之后============");
for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {
System.out.println(beanDefinitionName);
}AnnotationConfigApplicationContext
1
2
3
4
5
6
7private static void testAnnotationConfigApplicationContext() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
for (String beanDefinitionName : context.getBeanDefinitionNames()) {
System.out.println(beanDefinitionName);
}
System.out.println(context.getBean(Bean2.class).getBean1());
}AnnotationConfigServletWebServerApplicationContext
1
2
3public static void testAnnotationConfigServletWebServerApplicationContext() {
AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext(WebConfig.class);
}
