Я играл с областями прототипов и, просто чтобы понять, как работают прокси, я попробовал 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
Почему прокси-прототип не вызывает конструктор при каждом запросе нового компонента?