Spring Framework原理学习
2023-04-05 23:36:07 0 举报
Spring Framework原理学习笔记
作者其他创作
大纲/内容
1、BeanFactory和ApplicationContext关系 ConfigurableApplicationContext继承ApplicationContext ApplicationContext继承BeanFactory
知识点:
1
// Step1:添加annotationConfig后处理器,只是添加到beanFactory中,并未执行AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);// Step2:获取并运行已加入的后处理器 beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().forEach(beanFactoryPostProcessor -> { beanFactoryPostProcessor.postProcessBeanFactory(beanFactory); });
创建beanFactory
b style=\
// 配置文件在classPath目录下,也就是在resources根目录 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(\"beanConfig.xml\");for (String beanName : context.getBeanDefinitionNames()) { System.out.println(beanName); }
实例程序:
2、添加@Bean注解的后处理器
AnnotationConfigServletWebServerApplicationContext 很容易写成AnnotationConfigServletWebApplicationContext
预实例化已定义在beanFactory中的Bean
运行后处理器
BeanFactory和Bean后处理器应用方法不同
1、基于classpath下的XML格式的配置文件创建 ClassPathXmlApplicationContext2、基于磁盘路径下的XML文件配置创建 FileSystemXmlApplicationContext3、基于Java配置类创建 AnnotationConfigApplicationContext4、基于Java配置类创建,用于Web环境 AnnotationConfigServletWebServerApplicationContextfont color=\"#000000\
Notice: 1、第一个程序中AppConfig类中可以不用任何注解也行,但是这时span style=\
疑问: 1、AnnotationConfigServletWebServerApplicationContext和AnnotationConfigServletWebApplicationContext区别? 在写测试代码时将两个类混淆了,导致测试代码不能正常运行,所以很想知道它俩的区别,都是用于创建Web应用上下文(span style=\
System.out.println(content.getEnvironment().getProperty(\"java_home\")); System.out.println(content.getEnvironment().getProperty(\"server.port\"));
ApplicationContext的实现
4、基于Java配置类创建,用于Web环境
1、基于classpath下的XML格式的配置文件创建
2、基于磁盘路径下的XML文件配置创建
BeanFactory接口实现特点
1、ApplicationContext父接口 MessageSource: 国际化多语言 ResourcePatterResolver: 通配符匹配资源,主要是找到相关配置文件 ApplicationEventPublisher: 发布事件 EnviromentCapable: 读取环境变量,yml和properities文件中的键值
3、基于Java配置类创建
容器接口
beanFactory.getBean获取Bean使用
ApplicationContext接口
MessageSource: 国际化多语言
// 实例化创建一个BeanFactory DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // 定义Bean获取bean定义实例,这里是创建的AppConfig类的定义 AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(AppConfig.class).setScope(\"singleton\").getBeanDefinition(); // 通过Bean定义注册Bean到beanFactory beanFactory.registerBeanDefinition(\"appConfig\
Resource[] resources = context.getResources(\"classpath*:META-INF/spring.factories\");for (Resource resource : resources) { System.out.println(resource);}
疑问: 1、Bean是什么时候创建的? 默认使用beanFactory.getBean()方法获取Bean时创建,单例Bean可以通过beanFactory.preInstantiateSingletons();预创建好实例
3
ResourcePatterResolver
Notice: 1、ApplicationEventPublisher收发事件主要使用content.publishEvent方法,具体代码省略,主要是解耦,如用户注册成功后异步发送激活邮件等
font color=\"#000000\
装载后处理器进容器
EnviromentCapable
使用BeanDefinition注册Bean进容器
1、定义Bean放入实例化好的BeanFactory
4
Notice: 1、SpringApplication.run方法返回的是ConfigurableApplicationContext
疑问: 1、ApplicationContext和BeanFactory的区别? span style=\
2、BeanFactory的实现类DefaultListableBeanFactory 单例Bean存放在DefaultListableBeanFactory的父类 DefaultSingletonBeanRegistry中的singletonObjects中,这个变量是ConcurrentHashMap类型,可以使用反射获取变量的值,获取容器中所有的单例Bean
2
附加:程序1、2 配置文件读取方式的实际工作原理
为需要放入Bean容器的类生成BeanDefinition
收藏
0 条评论
下一页