网站制作步骤流程图,网站开发的项目实战,拉新平台哪个好佣金高,多个网站优化怎么做#x1f40c;个人主页#xff1a; #x1f40c; 叶落闲庭 #x1f4a8;我的专栏#xff1a;#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也#xff0c;而不可夺坚#xff1b;丹可磨也#xff0c;而不可夺赤。 容器实现 一、BeanFactory实现的特点1.1 Be… 个人主页 叶落闲庭 我的专栏 c语言 数据结构 javaEE 操作系统 Redis 石可破也而不可夺坚丹可磨也而不可夺赤。 容器实现 一、BeanFactory实现的特点1.1 BeanFactory实现1.2 BeanFactory无法解析Configuration和Bean 一、BeanFactory实现的特点
1.1 BeanFactory实现
BeanFactory是通过一个DefaultListableBeanFactory来实现的首先要创建一个DefaultListableBeanFactory的实例对象创建好后就作为一个核心的spring容器此时容器中还没有bean这时需要创建bean的定义主要是描述bean的特征包括类型scope单例、多例,是否有初始化方法和销毁方法根据这些描述信息就能知道bean有哪些特点并根据这些描述信息将bean创建出来bean的定义通过BeanDefinitionBuilder.genericBeanDefinition(Config.class)创建参数Config.class表示将Config这个类交给BeanFactory管理然后通过调用getBeanDefinition()将bean定义对象创建好即
AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition(com.dobbopro.TestBeanFactory.Config.class).setScope(singleton).getBeanDefinition();接下来通过beanFactory.registerBeanDefinition(config,beanDefinition);将这个定义好的bean进行注册注册好的bean的名字就是第一个参数configbean创建好后可以进行验证通过beanFactory.getBeanDefinitionNames()就可以得到bean的名字
代码实现
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** Author YJ* Date 2023/10/1 20:36* Description:BeanFactory实现*/
public class TestBeanFactory {public static void main(String[] args) {DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();//定义beanDefinitionAbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition(com.dobbopro.TestBeanFactory.Config.class).setScope(singleton).getBeanDefinition();//注册beanDefinitionbeanFactory.registerBeanDefinition(config,beanDefinition);for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {System.out.println(beanDefinitionName); }}Configurationstatic class Config{Beanpublic Bean1 bean1() {return new Bean1();}Beanpublic Bean2 bean2() {return new Bean2();}}static class Bean1{private static final Logger log LoggerFactory.getLogger(Bean1.class);public Bean1() {log.debug(构造Bean1());}Autowiredprivate Bean2 bean2;public Bean2 getBean2() {return bean2;}}static class Bean2{private static final Logger log LoggerFactory.getLogger(Bean2.class);public Bean2() {log.debug(构造Bean2());}}
}验证结果
1.2 BeanFactory无法解析Configuration和Bean
经过上述代码可以看出spring容器中只有一个config的bean,加了Bean注解的Bean1和Bean2并没添加到容器中说明BeanFactory无法解析Configuration和BeanConfiguration和Bean的解析是由其他的类来实现的AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);这个方法是给BeanFactory添加一些常用的后处理器有了后处理器就可以解析Configuration和Bean这些注解了具备了BeanFactory的一些扩展功能调用这个方法后就可以将带有注解Bean对应的bean对象添加到BeanFactory注意此时运行代码还不会将带有Bean注解的bean1和bean2补充到BeanFactory中这时只是添加到了BeanFactory还没有运行后处理器相当于工厂中有bean这个东西但是它们还没有工作
public static void main(String[] args) {DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();//定义beanDefinitionAbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition(com.dobbopro.TestBeanFactory.Config.class).setScope(singleton).getBeanDefinition();//注册beanDefinitionbeanFactory.registerBeanDefinition(config,beanDefinition);//给BeanFactory添加后处理器AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}}要想让bean1和bean2运行起来需要先通过beanFactory.getBeansOfType(BeanFactoryPostProcessor.class)拿到Bean工厂中的所有后处理器得到是一个Map集合这个Map集合的key就是后处理器的名字value就是它们的值通过foeEach拿到每一个后处理器最后进行打印
public static void main(String[] args) {DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();//定义beanDefinitionAbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition(com.dobbopro.TestBeanFactory.Config.class).setScope(singleton).getBeanDefinition();//注册beanDefinitionbeanFactory.registerBeanDefinition(config,beanDefinition);//给BeanFactory添加后处理器AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory);beanFactory.getBeansOfType(BeanFactoryPostProcessor.class).values().stream().forEach(beanFactoryPostProcessor - {beanFactoryPostProcessor.postProcessBeanFactory(beanFactory);});for (String beanDefinitionName : beanFactory.getBeanDefinitionNames()) {System.out.println(beanDefinitionName);}}