spring在单例模式下使用ApplicationContext.getBean和@Autowired注入的bean是同一个bean,及判断方式

ApplicationContext

ApplicationContext可以理解成一个包含所有bean的容器,在单例模式下当有其他地方需要使用某一个bean的时候他就取出来注入到那个地方,所有在不同地方采用@Autowired注入的同一个类型的bean都是同一个bean。

ApplicationContext.getBean

既然@Autowired注入的bean都是从这个ApplicationContext容器中获取的,那么在@Configuration类中注入ApplicationContext后使用ApplicationContext.getBean(XXX.class)获取到的bean和@Autowired注入的XXX bean都是同一个。因为他们都是来自于同一个容器。

spring在单例模式下使用ApplicationContext.getBean和@Autowired注入的bean是同一个bean,及判断方式_第1张图片

直接==不明确的话还可以比hash
可以使用
System.identityHashCode比较hash
== 和 System.identityHashCode的值都相等的话肯定就是相等的

System.identityHashCode(waybillApiService) == System.identityHashCode(waySvc)

上面提到了System.identityHashCode就稍微介绍下

hashCode是 java.lang.Object.hashCode() 或者 java.lang.System.identityHashCode(obj) 会返回的值。他是一个对象的身份标识。官方称呼为:标识哈希码( identity hash code)。

特点

  • 一个对象在其生命期中 identity hash code 必定保持不变;
  • 如果a == b,那么他们的System.identityHashCode() 必须相等;
    如果他们的System.identityHashCode() 不相等,那他们必定不是同一个对象(逆否命题与原命题真实性总是相同);
  • 如果System.identityHashCode() 相等的话,并不能保证 a == b(毕竟这只是一个散列值,是允许冲突的)。

由特征2可知,只要判断出两个对象的hashCode不一致,就知道这两个对象不是同一个;又因为hashCode()的性能比 " == "性能高得多,所以多数时候,用它来判断重复。

为啥hashCode()性能高? 因为hashCode()的结果算出来后缓存起来,下次调用直接用不需要重新计算,提高性能

你可能感兴趣的:(spring,JAVA)