一.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 存储在堆内存空间。