StaticListableBeanFactory
此类为org.springframework.beans.factory.BeanFactory的一个实现类
只允许注册已经存在的单例实例,不支持prototype和aliases
该类实现了ListableBeanFactory 也就是允许遍历得到BeanFactory保存的bean实体
public class StaticListableBeanFactory implements ListableBeanFactory { /** Map from bean name to bean instance */ private final Map<String, Object> beans = new HashMap<String, Object>(); /** * Add a new singleton bean. * Will overwrite any existing instance for the given name. * @param name the name of the bean * @param bean the bean instance */ public void addBean(String name, Object bean) { this.beans.put(name, bean); } //--------------------------------------------------------------------- // 以下的内容实现了BeanFactory接口 //--------------------------------------------------------------------- // 通过名字获取Bean // 这里根据需要得到的bean是否是FactoryBean做了判断 // 假设输入的name是一个FactoryBean的名字 // 若输入的名字是"&name"那么返回FactoryBean类本身的实例 // 不然若输入的是"name" 那么返回FactoryBean类的实例所管理的实例 public Object getBean(String name) throws BeansException { // 这个是用来获取beanName的 FactoryBean的输入若为"&name"的话会变为"name" String beanName = BeanFactoryUtils.transformedBeanName(name); // 通过名字获取bean Object bean = this.beans.get(beanName); // 如果bean为空则抛出异常 if (bean == null) { throw new NoSuchBeanDefinitionException(beanName, "Defined beans are [" + StringUtils.collectionToCommaDelimitedString(this.beans.keySet()) + "]"); } // 如果用了& 开头 但是这个名字对应的bean不是一个FactoryBean 则会抛出异常 if (BeanFactoryUtils.isFactoryDereference(name) && !(bean instanceof FactoryBean)) { throw new BeanIsNotAFactoryException(beanName, bean.getClass()); } // 若得到的bean是FactoryBean 并且不是以&开头的 那么返回该FactoryBean负责管理的实例 if (bean instanceof FactoryBean && !BeanFactoryUtils.isFactoryDereference(name)) { try { return ((FactoryBean) bean).getObject(); } catch (Exception ex) { throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex); } } else { return bean; } } // 调用上面的方法 然后进行类型判断 如果得到的bean的类型是requiredType的类(或者子类)则返回 @SuppressWarnings("unchecked") public <T> T getBean(String name, Class<T> requiredType) throws BeansException { Object bean = getBean(name); // 需要的类型为null就属于所有都匹配 // 不为null并且类型又不匹配就抛出异常 if (requiredType != null && !requiredType.isAssignableFrom(bean.getClass())) { throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass()); } return (T) bean; } // 获得requiredType类型的Bean实例 public <T> T getBean(Class<T> requiredType) throws BeansException { //得到bean的name数组 String[] beanNames = getBeanNamesForType(requiredType); if (beanNames.length == 1) {、 // 调用以上方法进行判断 return getBean(beanNames[0], requiredType); } else if (beanNames.length > 1) { throw new NoUniqueBeanDefinitionException(requiredType, beanNames); } else { throw new NoSuchBeanDefinitionException(requiredType); } } // 这个方法就是个摆设 在这个类里不支持 public Object getBean(String name, Object... args) throws BeansException { if (args != null) { throw new UnsupportedOperationException( "StaticListableBeanFactory does not support explicit bean creation arguments)"); } return getBean(name); } public boolean containsBean(String name) { return this.beans.containsKey(name); } // 判断bean是否单例(这里只对FactoryBean有效) public boolean isSingleton(String name) throws NoSuchBeanDefinitionException { Object bean = getBean(name); // In case of FactoryBean, return singleton status of created object. return (bean instanceof FactoryBean && ((FactoryBean) bean).isSingleton()); } // 判断bean是否Prototype(这里只对FactoryBean有效) public boolean isPrototype(String name) throws NoSuchBeanDefinitionException { Object bean = getBean(name); // In case of FactoryBean, return prototype status of created object. return ((bean instanceof SmartFactoryBean && ((SmartFactoryBean) bean).isPrototype()) || (bean instanceof FactoryBean && !((FactoryBean) bean).isSingleton())); } public boolean isTypeMatch(String name, Class targetType) throws NoSuchBeanDefinitionException { Class type = getType(name); return (targetType == null || (type != null && targetType.isAssignableFrom(type))); } // 获得输入name的bean的类型(和以上getBean(String name)相似) public Class<?> getType(String name) throws NoSuchBeanDefinitionException { String beanName = BeanFactoryUtils.transformedBeanName(name); Object bean = this.beans.get(beanName); if (bean == null) { throw new NoSuchBeanDefinitionException(beanName, "Defined beans are [" + StringUtils.collectionToCommaDelimitedString(this.beans.keySet()) + "]"); } if (bean instanceof FactoryBean && !BeanFactoryUtils.isFactoryDereference(name)) { // If it's a FactoryBean, we want to look at what it creates, not the factory class. return ((FactoryBean) bean).getObjectType(); } return bean.getClass(); } // 这个方法没什么意义 public String[] getAliases(String name) { return new String[0]; } //--------------------------------------------------------------------- // Implementation of ListableBeanFactory interface //--------------------------------------------------------------------- // 以下的BeanDefinition就是Map中的key public boolean containsBeanDefinition(String name) { return this.beans.containsKey(name); } public int getBeanDefinitionCount() { return this.beans.size(); } public String[] getBeanDefinitionNames() { return StringUtils.toStringArray(this.beans.keySet()); } public String[] getBeanNamesForType(Class type) { return getBeanNamesForType(type, true, true); } // includeNonSingletons这个参数在这边没什么用 public String[] getBeanNamesForType(Class type, boolean includeNonSingletons, boolean includeFactoryBeans) { // 这个类是否是FactoryBean的子类 boolean isFactoryType = (type != null && FactoryBean.class.isAssignableFrom(type)); List<String> matches = new ArrayList<String>(); // 遍历所有的名字 for (String name : this.beans.keySet()) { Object beanInstance = this.beans.get(name); // 如果按照名字得到的是一个FactoryBean并且type不是Factory类型的话就执行(获取BeanFactory管理的实例) if (beanInstance instanceof FactoryBean && !isFactoryType) { // 是否包括FactoryBean if (includeFactoryBeans) { // 得到FactoryBean管理的实例的类型 Class objectType = ((FactoryBean) beanInstance).getObjectType(); if (objectType != null && (type == null || type.isAssignableFrom(objectType))) { matches.add(name); } } } else { if (type == null || type.isInstance(beanInstance)) { matches.add(name); } } } return StringUtils.toStringArray(matches); } public <T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException { return getBeansOfType(type, true, true); } @SuppressWarnings("unchecked") public <T> Map<String, T> getBeansOfType(Class<T> type, boolean includeNonSingletons, boolean includeFactoryBeans) throws BeansException { boolean isFactoryType = (type != null && FactoryBean.class.isAssignableFrom(type)); Map<String, T> matches = new HashMap<String, T>(); for (Map.Entry<String, Object> entry : beans.entrySet()) { String beanName = entry.getKey(); Object beanInstance = entry.getValue(); // Is bean a FactoryBean? if (beanInstance instanceof FactoryBean && !isFactoryType) { if (includeFactoryBeans) { // Match object created by FactoryBean. FactoryBean factory = (FactoryBean) beanInstance; Class objectType = factory.getObjectType(); if ((includeNonSingletons || factory.isSingleton()) && objectType != null && (type == null || type.isAssignableFrom(objectType))) { matches.put(beanName, getBean(beanName, type)); } } } else { if (type == null || type.isInstance(beanInstance)) { // If type to match is FactoryBean, return FactoryBean itself. // Else, return bean instance. if (isFactoryType) { beanName = FACTORY_BEAN_PREFIX + beanName; } matches.put(beanName, (T) beanInstance); } } } return matches; } // 返回带有特定Annotation的对象 public Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException { Map<String, Object> results = new LinkedHashMap<String, Object>(); for (String beanName : this.beans.keySet()) { if (findAnnotationOnBean(beanName, annotationType) != null) { results.put(beanName, getBean(beanName)); } } return results; } public <A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType) { // 这个会去搜索所给类型(以及实现的接口和父类)是否有给定的annotationType return AnnotationUtils.findAnnotation(getType(beanName), annotationType); } }
相关推荐
最常见的算法是可达性分析,它通过GC Roots来判断对象是否存活。GC Roots包括虚拟机栈中的本地变量引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象以及本地方法栈中JNI(Native方法)引用的对象。...
All Classes AbstractAdvisorAutoProxyCreator AbstractApplicationContext AbstractApplicationEventMulticaster AbstractAspectJAdvice AbstractAspectJAdvisorFactory AbstractAspectJAdvisorFactory....
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。 替换数据可以直接使用,注释清楚,适合新手
广东省关于人工智能赋能千行百业的若干措施.docx
湖北省数据条例(草案)(征求意见稿).docx
中软国际IT培训中心的培训教程,属于学习CSS网页设计的基础入门教程,讲一些原理和概念,高深的理论不太多。
Python Data Structures and Algorithms Minimal and clean example implementations of data structures and algorithms in Python 3. Contribute Thank you for your interest in contributing! There are many ways to contribute to the project. Start testing from here Take note when running all tests using unittest $ python3 -m unittest discover tests To run some specific tests you can do the following (e.g. sort) $ python3 -m unittest tests.test_sort Run all tests using pytest Make a note when $ python3 -m
TeamIDE-win-2.6.31Team IDE 集成MySql、Oracle、金仓、达梦、神通等数据库、SSH、FTP、Redis、Zookeeper、Kafka、Elasticsearch、M
内容概要:本文综述了C、C++、Python、Java这四种主流编程语言中,用于实现常见和高级算法的学习资料,覆盖范围广泛,从书籍、在线课程平台到GitHub上的开源代码仓库均有提及。每种语言都详述了推荐的学习资源及其优势,旨在满足不同程度学习者的需要。 适合人群:对算法实现有兴趣的学生、自学爱好者、开发者等。 使用场景及目标:帮助读者挑选合适的语言和资源深入理解算法的理论与实际编码技巧,适用于个人提升、项目实践或教学使用。 其他说明:文章提供了丰富的学习渠道和实战项目,既适合作为基础理论的学习,也适合于实际操作练习,尤其强调通过实做加深理解的重要性。
aiuiphone0000000000000000000
支持多场景回调开箱即用 原生仿百度登录验证.zip
2023 年“泰迪杯”数据分析技能赛B题-企业财务数据分析与造假识别 完整代码
Levenshtein Python C 扩展模块包含用于快速计算 Levenshtein 距离和字符串相似度的函数内容需要维护者介绍文档执照历史源代码作者需要维护者我 (Mikko Ohtamaa) 目前不维护此代码。我只是为了方便起见才将其拉到 Github 上的(之前在公共存储库中不可用)。因此,如果您提交了任何问题,我都不会调查。介绍Levenshtein Python C 扩展模块包含用于快速计算的函数Levenshtein(编辑)距离和编辑操作字符串相似度近似中位数字符串,以及一般字符串平均值字符串序列和集合相似度它同时支持普通字符串和 Unicode 字符串。需要 Python 2.2 或更新版本。StringMatcher.py 是一个基于 Levenshtein 构建的类似 SequenceMatcher 的示例类。它缺少一些 SequenceMatcher 的功能,但又有一些额外的功能。Levenshtein.c 也可以用作纯 C 库。您只需在编译时定义 NO_PYTHON 预处理器符号 (-DNO_PYTH
基于OpenCV像素检测的Onmyoji游戏脚本
Pythonbot高斯网格图射线投射网格图激光雷达至网格地图k-均值对象聚类矩形接头大满贯迭代最近点 (ICP) 匹配FastSLAM 1.0路径规划动态窗口方法基于网格的搜索Dijkstra 算法A* 算法D*算法D* Lite 算法位场算法基于网格的覆盖路径规划国家网格规划偏极采样车道采样概率路线图(PRM)规划快速探索随机树(RRT)回程时间*RRT* 和 reeds-shepp 路径LQR-RRT*五次多项式规划Reeds Shepp 规划基于LQR的路径规划Frenet 框架中的最佳轨迹路径追踪移动到姿势控制斯坦利控制后轮反馈控制线性二次调节器 (LQR) 速度和转向控制模型预测速度和转向控制采用 C-GMRES 的非线性模型预测控制手臂导航N关节臂对点控制带避障功能的手臂导航航空导航无人机三维轨迹跟踪火箭动力着陆双足动物倒立摆双
可信任的企业4.0生态系统.pptx
学生信息包括:学号,姓名,年龄,性别,出生年月,地址,电话,E-mail等。试设计一学生信息管理系统,系统提供菜单方式作为人机界面并具有如下功能: 学生信息录入功能 学生信息浏览功能 按学号、姓名等进行查询、排序功能 2、要求界面简单明了;对输入的数据具有有效性检查能力,比如输入的成绩不在0~100之间,要求重新输入;
原生js谷歌网页电吉他弹奏源码.rar
原生js微信分享到朋友圈浮动层代码.zip