• 每日五问(java)


    一.spring如果有两个id相同的bean会报错吗
    首先,在同一个 XML 配置文件里面,不能存在 id 相同的两个 bean,否则 spring容器启动的时候会报错,因为 id 这个属性表示一个 Bean 的唯一标志符号,所以 Spring 在启动的时候会去验证 id 的唯一性,一旦发现重复就会报错,这个错误发生 Spring 对 XML 文件进行解析转化为 BeanDefinition 的阶段。但是在两个不同的 Spring 配置文件里面,可以存在 id 相同的两个 bean。 IOC容器在加载 Bean 的时候,默认会多个相同 id 的 bean 进行覆盖。
    在 Spring3.x 版本以后,这个问题发生了变化我们知道 Spring3.x 里面提供@Configuration 注解去声明一个配置类,然后使用@Bean 注解实现 Bean 的声明,这种方式完全取代了 XMl。在这种情况下,如果我们在同一个配置类里面声明多个相同名字的bean,在Spring IOC 容器中只会注册第一个声明的 Bean 的实例。后续重复名字的 Bean 就不会再注册了。像这样一段代码,在 Spring IOC 容器里面,只会保存 UserService01 这个实例,后续相同名字的实例不会再加载
    如果使用@Autowired 注解根据类型实现依赖注入,因为 IOC 容器只有UserService01的实例,所以启动的时候会提示找不到UserService02这个实例
    如果使用@Resource 注解根据名词实现依赖注入,在 IOC 容器里面得到的实例对象是 UserService01,于是 Spring 把 UserService01 这个实例赋值给 UserService02,就会提示类型
    不匹配错误这个错误,是在 Spring IOC 容器里面的 Bean 初始化之后的依赖注入阶段发生的。
    二.Mybatis的Xml映射文件中,不同的Xml映射文件,id是否可以重复?
    不同的xml映射文件的id可以重复,因为实际命名namespace+id,而namespace在不同的xml映射文件中不能重复,并且namespace不能为空,所以在不同的xml映射文件中id可以重复
    三.Bean的实例化方式
    Spring为Bean提供了多种实例化方式,通常包括4种方式。(也就是说在Spring中为Bean对象的创建准备了多种方案,目的是:更加灵活)
    ● 第一种:通过构造方法实例化
    ● 第二种:通过简单工厂模式实例化
    ● 第三种:通过factory-bean实例化
    ● 第四种:通过FactoryBean接口实例化
    四. BeanFactory和FactoryBean的区别
    BeanFactory
    Spring IoC容器的顶级对象,BeanFactory被翻译为“Bean工厂”,在Spring的IoC容器中,“Bean工厂”负责创建Bean对象。
    BeanFactory是工厂。
    FactoryBean:它是一个Bean,是一个能够辅助Spring实例化其它Bean对象的一个Bean。
    在Spring中,Bean可以分为两类:
    ● 第一类:普通Bean
    ● 第二类:工厂Bean(记住:工厂Bean也是一种Bean,只不过这种Bean比较特殊,它可以辅助Spring实例化其它Bean对象。)
    五.String、StringBuffer、StringBuilder区别
    关于 String、StringBuffer、StringBuilder 的区别,我想从四个角度来说明。
    第一个,可变性。String 内部的 value 值是 final 修饰的,所以它是不可变类。所以每次修改 String的值,都会产生一个新的对象。StringBuffer 和 StringBuilder 是可变类,字符串的变更不会产生新的对象
    第二个,线程安全性。
    String 是不可变类,所以它是线程安全的。StringBuffer 是线程安全的,因为它每个操作方法都加了synchronized 同步关键字。
    StringBuilder 不是线程安全的,所以在多线程环境下对字符串进行操作,应该使用 StringBuffer,否则使用 StringBuilder
    第三个,性能方面。
    String 的性能是最的低的,因为不可变意味着在做字符串拼接和修改的时候,需要重新创建新的对象以及分配内存。
    其次是 StringBuffer 要比 String 性能高,因为它的可变性使得字符串可以直接被修改最后是 StringBuilder,它比 StringBuffer 的性能高,因为 StringBuffer 加了同步锁
    第四个,存储方面。
    String 存储在字符串常量池里面
    StringBuffer 和 StringBuilder 存储在堆内存空间。

  • 相关阅读:
    深度学习系列45:图像恢复综述
    flask-cache使用报错Python3 ModuleNotFoundError: No module named ‘werkzeug.contrib‘
    Github上1.1KFork的C++笔记
    综合实验 电子记事本的设计与实现——Java
    [C#]JCoder.Mock4Net,可用于模拟数据的c#类库
    机器学习编译器的前世今生
    从0开始设计一个物联网网关
    讲述java中常见的几种缓存数据形式 并简单演示
    拓展培训开场白集锦
    Apache DolphinScheduler 如何实现自动化打包+单机/集群部署?
  • 原文地址:https://blog.csdn.net/Nicholas_giao/article/details/127693996