为啥spring不同配置中可以存在相同的id的bean

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥spring不同配置中可以存在相同的id的bean相关的知识,希望对你有一定的参考价值。

1、在spring同一个配置文件中,不能存在id相同的两个bean,否则会报错。2、在两个不同的spring配置文件中,可以存在id相同的两个bean,启动时,不会报错。这是因为spring ioc容器在加载bean的过程中,类DefaultListableBeanFactory会对id相同的bean进行处理:后加载的配置文件的bean,覆盖先加载的配置文件的bean。DefaultListableBeanFactory类中,有个属性allowBeanDefinitionOverriding,默认值为true,该值就是用来指定出现两个bean的id相同的情况下,如何进行处理。如果该值为false,则不会进行覆盖,而是抛出异常。

参考技术A 你想问什么? 参考技术B 你这是自问自答啊

为啥相同的数组代码的执行时间存在差异?

【中文标题】为啥相同的数组代码的执行时间存在差异?【英文标题】:Why is there disparity between execution time for the same code of arrays?为什么相同的数组代码的执行时间存在差异? 【发布时间】:2014-04-02 22:46:13 【问题描述】:

如果我运行以下程序,然后在 sum+=arr[i][j] 中交换 i 和 j 后再次运行它,则执行时间非常不同,即 9.8 秒与交换前的 2.7 秒相比。我只是不明白为什么会这样。有人可以告诉我为什么会这样吗?

#include<iostream>
#include<time.h>
using namespace std;

int main()

    int long sum=0;
    int size = 1024;
    clock_t start, end;
    double msecs;
    start = clock();

    int **arr = new int*[size];
    for (int i = 0; i < size; i++) 
    
        arr[i] = new int[size];
    

    for(int kk=0; kk<1000; kk++) 
    
        sum = 0;
        for (int i = 0; i < size; i++)
        
            for (int j = 0; j < size ; j++)
            
                sum += arr[i][j];
            
        
    

    end = clock();  
    msecs = ((double) (end - start)) * 1000 / CLOCKS_PER_SEC;
    cout<<msecs<<endl<<endl;

    return 0;

【问题讨论】:

谷歌“缓存命中性能”(与您的问题无关,这是一个非常擅长表演的艺术团体)。 还有 Google 的“数据驱动开发”和“优化数组” 在本主题中要搜索的另一个非常重要的关键字是“prefetch”。 x86 和 x64 会自动执行此操作,在一些较笨的硬件上,您必须使用程序集或内部函数为自己手动进行预取。从 cpu 的角度来看,通过线性扫描 1-2 个内存区域的算法简单地优于使用看似“随机访问”策略的算法。这通常就是为什么经典链表很糟糕的原因,尤其是与基于向量的数据结构相比,没有自定义分配器的情况下,有时会根据您需要的操作在获胜者之间混合。 【参考方案1】:

这是由于空间局部性。当您的程序需要内存中的一些数据时,处理器不仅会读取该特定数据,还会读取相邻数据。因此,在下一次迭代中,当您需要下一组数据时,它已经在您的缓存中了。

在另一种情况下,您的程序无法利用空间局部性,因为您没有在连续迭代中读取相邻数据。

假设您的数据在内存中的布局如下:

  0  1  2  3  4  5  6  7  8  9 
 10 11 12 13 14 15 16 17 18 19
 20 21 22 23 24 25 26 27 28 29

当您的程序需要读取标记为0 的数据时,它会读取整行:0 1 2 3 4 5 6 7 8 9

因此,当您需要标记为 1 的数据时,它已经在缓存中,您的程序运行得更快。

相反,如果您正在读取数据列,这对您没有帮助,每次您遇到缓存未命中并且处理器必须再次进行内存读取。

简而言之,内存读取成本很高,这是处理器优化读取以节省时间的方式。

【讨论】:

所以我的理解是例如 arr[0][0], arr[0][1], arr[0][2] 被加载到缓存中但是当程序突然询问对于 arr[1][0] 它不在缓存中,因此必须从主内存中加载,这使程序变慢。我有什么遗漏的吗? 是的,这正是发生的事情。 使用一维数组的一个很好的理由,您可以通过使用正确的数组索引来“模拟”二维数组。 “多维数组”,其中每一行是单独动态分配的,但程序永远不需要使不同的行具有不同的长度,恕我直言,似乎使用得太多了。

以上是关于为啥spring不同配置中可以存在相同的id的bean的主要内容,如果未能解决你的问题,请参考以下文章

为啥来自 Spring 的 BCryptPasswordEncoder 为相同的输入生成不同的输出?

Spring配置文件XML详解

为啥相同的数组代码的执行时间存在差异?

java spring配置中设置两个相同id的bean可以吗?

Spring的学习____3.spring配置文件的解析

spring bean定义