当前位置: 首页 > news >正文

DefaultListableBeanFactory

DefaultListableBeanFactory 是一个完整的、功能成熟的 IoC 容器,如果你的需求很简单,甚至可以直接使用 DefaultListableBeanFactory,如果你的需求比较复杂,那么通过扩展 DefaultListableBeanFactory 的功能也可以达到,可以说 DefaultListableBeanFactory 是整个 Spring IoC 容器的始祖。

新建两个实体类User和UserMessage类和一个配置类MyConfig

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserMessage {private String phone;private String address;
}@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String username;@Autowiredprivate UserMessage userMessage;
}public class MyConfig {@Beanpublic User user(){return new User();}@Beanpublic UserMessage userMessage(){return new UserMessage("17860397188","123456");}
}

 动态注册 Bean,这是 DefaultListableBeanFactory 的功能之一,不过准确来说应该是动态注册 BeanDefinition 。

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition(MyConfig.class).getBeanDefinition();beanFactory.registerBeanDefinition("config",beanDefinition);AnnotationConfigUtils.registerAnnotationConfigProcessors(beanFactory); //为beanfactory添加后处理器//beanfactory 后处理器解析@Bean等注解Map<String, BeanFactoryPostProcessor> beansOfType = beanFactory.getBeansOfType(BeanFactoryPostProcessor.class);beansOfType.values().forEach(i->i.postProcessBeanFactory(beanFactory));//Bean后处理器,针对Bean生命周期的各个阶段提供扩展,例如@AutowiredbeanFactory.getBeansOfType(BeanPostProcessor.class).values().forEach(beanFactory::addBeanPostProcessor);Arrays.stream(beanFactory.getBeanDefinitionNames()).forEach(i-> System.out.println(i));User user = (User) beanFactory.getBean("user");System.out.println(user.getUserMessage());

Bean 的懒加载。这个时候先把 BeanDefinition 定义好,等到真正调用 Bean 的时候,才会去初始化 Bean。在 DefaultListableBeanFactory 中还有一个 preInstantiateSingletons 方法可以提前注册 Bean,该方法是在 ConfigurableListableBeanFactory 接口中声明的,DefaultListableBeanFactory 类实现了 ConfigurableListableBeanFactory 接口并实现了接口中的方法。

@Override
public void preInstantiateSingletons() throws BeansException {if (logger.isTraceEnabled()) {logger.trace("Pre-instantiating singletons in " + this);}// Iterate over a copy to allow for init methods which in turn register new bean definitions.// While this may not be part of the regular factory bootstrap, it does otherwise work fine.List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...for (String beanName : beanNames) {RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {if (isFactoryBean(beanName)) {Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);if (bean instanceof FactoryBean) {final FactoryBean<?> factory = (FactoryBean<?>) bean;boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>)((SmartFactoryBean<?>) factory)::isEagerInit,getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {getBean(beanName);}}}else {getBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...for (String beanName : beanNames) {Object singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {smartSingleton.afterSingletonsInstantiated();}}}
}

http://www.lryc.cn/news/228997.html

相关文章:

  • NSF服务器
  • 10 Go的映射
  • 瑞萨e2studio(29)----SPI速率解析
  • mysql的主从复制,读写分离
  • 小米路由器4A千兆版刷入OpenWRT并远程访问
  • 【golang】探索for-range遍历实现原理(slice、map、channel)
  • 依赖倒转原则接口隔离原则迪米特法则合成复用原则
  • MATLAB | 官方举办的动图绘制大赛 | 第一周赛情回顾
  • 适配器模式 rust和java的实现
  • 竞赛 题目:垃圾邮件(短信)分类 算法实现 机器学习 深度学习 开题
  • wpf devexpress项目中添加GridControl绑定数据
  • 2023亚太杯数学建模A题思路解析
  • Spark3.0中的AOE、DPP和Hint增强
  • 算法笔记-第五章-质因子分解
  • 适用于WPF的设计模式
  • C++与多态
  • ios 对话框UIAlertController放 tableview
  • 警告:新版Outlook会向微软发送密码、邮件和其他数据
  • 数据结构C语言--基础实验
  • wireshark抓包并进行Eigrp网络协议分析
  • 力扣刷题-二叉树-二叉树的层序遍历(相关题目总结)
  • fundamental notes in 3D math
  • 【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法
  • 腾讯云5年云服务器还有吗?腾讯云5年时长服务器入口在哪?
  • odoo在iot领域的发展情况
  • Paas-云原生-容器-编排-持续部署
  • sass 生成辅助色
  • DevEco Studio开发工具下载、安装(HarmonyOS开发)_For Mac
  • 按键精灵中的字符串常用的场景
  • python数据结构与算法-01_抽象数据类型和面向对象编程