Поведение внедрения зависимости от прототипа в компоненте Prototype: с прокси и без - PullRequest
0 голосов
/ 29 марта 2020

Я играл с областями прототипов и, просто чтобы понять, как работают прокси, я попробовал 2 разные итерации зависимости прототипа внутри bean-компонента-прототипа - один с использованием прокси, а другой без.

Это мой ProtoType Dependency =>

@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("============> DUMMY JDBC CONNECTION ESTABLISHED, ID = {} ", this.hashCode());

    }

}

Это мой компонент ProtoType, внедренный с зависимостью Prototype =>

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PersonDao {
    private static final Logger LOGGER = LoggerFactory.getLogger(PersonDao.class);

    @Autowired
    private JdbcConnection jdbcConnection;

    public JdbcConnection getJdbcConnection(){
        return jdbcConnection;
    }
}

И здесь я регистрирую обработчики объектов при запросе нового компонента 3 раза, просто чтобы увидеть, возвращает ли он новый экземпляр

@SpringBootApplication
public class ScopePracticeApplication {

    private static final Logger LOGGER = LoggerFactory.getLogger(ScopePracticeApplication.class);

    public static void main(String[] args) {
    ApplicationContext applicationContext =  SpringApplication.run(ScopePracticeApplication.class, args);
        PersonDao personDao1 = applicationContext.getBean(PersonDao.class);
        LOGGER.info("==========> PersonDao1 instance = {}", personDao1);
        LOGGER.info("==========> PersonDao1.getJdbcConnection() instance = {}", personDao1.getJdbcConnection());

        PersonDao personDao2 = applicationContext.getBean(PersonDao.class);
        LOGGER.info("==========> PersonDao2 instance = {}", personDao2);
        LOGGER.info("==========> PersonDao2.getJdbcConnection() instance = {}", personDao2.getJdbcConnection());

        PersonDao personDao3 = applicationContext.getBean(PersonDao.class);
        LOGGER.info("==========> PersonDao3 instance = {}", personDao3);
        LOGGER.info("==========> PersonDao3.getJdbcConnection() instance = {}", personDao3.getJdbcConnection());

    }
}

Я заметил, что при добавлении ScopedProxyMode поверх зависимости JdbcConnection конструктор JdbcConnection () не вызывается:

==========> PersonDao1 instance = com.example.practice.scope.dao.PersonDao@272a179c
==========> PersonDao1.getJdbcConnection() instance = com.example.practice.scope.connection.JdbcConnection@bcb09a6
==========> PersonDao2 instance = com.example.practice.scope.dao.PersonDao@5173200b
==========> PersonDao2.getJdbcConnection() instance = com.example.practice.scope.connection.JdbcConnection@25c5e994
==========> PersonDao3 instance = com.example.practice.scope.dao.PersonDao@378bd86d
==========> PersonDao3.getJdbcConnection() instance = com.example.practice.scope.connection.JdbcConnection@2189e7a7

Между тем, без ScopedProxyMode поверх зависимости JdbcConnection, конструктор JdbcConnection () вызывается при каждом запросе нового компонента:

============> DUMMY JDBC CONNECTION ESTABLISHED, ID = 800456240 
==========> PersonDao1 instance = com.example.practice.scope.dao.PersonDao@19f040ba
==========> PersonDao1.getJdbcConnection() instance = com.example.practice.scope.connection.JdbcConnection@2fb5fe30
============> DUMMY JDBC CONNECTION ESTABLISHED, ID = 1923810797 
==========> PersonDao2 instance = com.example.practice.scope.dao.PersonDao@27e32fe4
==========> PersonDao2.getJdbcConnection() instance = com.example.practice.scope.connection.JdbcConnection@72ab05ed
============> DUMMY JDBC CONNECTION ESTABLISHED, ID = 205278236 
==========> PersonDao3 instance = com.example.practice.scope.dao.PersonDao@17d238b1
==========> PersonDao3.getJdbcConnection() instance = com.example.practice.scope.connection.JdbcConnection@c3c4c1c

Почему прокси-прототип не вызывает конструктор при каждом запросе нового компонента?

...