title: how to check if object instances using SCOPE_PROTOTYPE and ScopedProxyMode.TARGET_CLASS in Spring are different?
body: <p>I have two beans <code>PersonDAO</code> and <code>JdbcConnection</code> with dependency on each other. The <code>PersonDAO</code> bean is a singleton bean using <code>@Component</code>. But the <code>JdbcConnection</code> is a <code>prototype</code> and because it is injected inside the <code>PersonDAO</code> I am using <code>proxyMode = ScopedProxyMode.TARGET_CLASS</code> to ensure that it is a different instance (not a singleton).</p>
  <pre><code>import com.github.felipegutierrez.explore.spring.basics.beans.JdbcConnection;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.stereotype.Component;
  @Component
  public class PersonDAO {
      @Autowired
      private JdbcConnection jdbcConnection;
      public PersonDAO(JdbcConnection jdbcConnection) {
          this.jdbcConnection = jdbcConnection;
      }
      public JdbcConnection getJdbcConnection() {
          return jdbcConnection;
      }
      public void setJdbcConnection(JdbcConnection jdbcConnection) {
          this.jdbcConnection = jdbcConnection;
      }
  }
  
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.beans.factory.config.ConfigurableBeanFactory;
  import org.springframework.context.annotation.Scope;
  import org.springframework.context.annotation.ScopedProxyMode;
  import org.springframework.stereotype.Component;
  @Component
  @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
  public class JdbcConnection {
      private static final Logger LOGGER = LoggerFactory.getLogger(JdbcConnection.class);
      public JdbcConnection() {
          // LOGGER.info(&quot;This is my JdbcConnection that is not a singleton bean.&quot;);
      }
  
  }
  </code></pre>
  <p>When I print the object instance of them the <code>PersonDAO</code> is a singleton and the <code>JdbcConnection</code> is a different instance. But the hashcode of the <code>JdbcConnection</code> says that it is a singleton. Why is that?</p>
  <pre><code>ApplicationContext applicationContext = SpringApplication.run(ExploreSpringApplication.class, args);
  
  PersonDAO personDAO01 = applicationContext.getBean(PersonDAO.class);
  PersonDAO personDAO02 = applicationContext.getBean(PersonDAO.class);
  
  LOGGER.info(&quot;DAO 01: {}, {}, JDBCConnection: {}, {}&quot;, personDAO01, personDAO01.hashCode(), personDAO01.getJdbcConnection().hashCode(), personDAO01.getJdbcConnection());
  LOGGER.info(&quot;DAO 02: {}, {}, JDBCConnection: {}, {}&quot;, personDAO02, personDAO02.hashCode(), personDAO02.getJdbcConnection().hashCode(), personDAO02.getJdbcConnection());
  </code></pre>
  <p>output <code>JDBCConnection</code> of <code>DAO01</code> and <code>DAO02</code> has the same hashcode: <code>1596179075</code> but actually they are different instances: <code>JdbcConnection@58a55449</code> and <code>JdbcConnection@5949eba8</code>:</p>
  <pre><code>2021-03-08 18:13:29.527  INFO 10329 --- [           main] c.g.f.e.spring.ExploreSpringApplication  : DAO 01: 1187972599, com.github.felipegutierrez.explore.spring.basics.dao.PersonDAO@46cf05f7
  2021-03-08 18:13:29.527  INFO 10329 --- [           main] c.g.f.e.spring.ExploreSpringApplication  : DAO 01 JDBCConnection: 1596179075, com.github.felipegutierrez.explore.spring.basics.beans.JdbcConnection@58a55449
  2021-03-08 18:13:29.529  INFO 10329 --- [           main] c.g.f.e.spring.ExploreSpringApplication  : DAO 02: 1187972599, com.github.felipegutierrez.explore.spring.basics.dao.PersonDAO@46cf05f7
  2021-03-08 18:13:29.529  INFO 10329 --- [           main] c.g.f.e.spring.ExploreSpringApplication  : DAO 02 JDBCConnection: 1596179075, com.github.felipegutierrez.explore.spring.basics.beans.JdbcConnection@5949eba8
  </code></pre>