• [Spring Boot] Complex Scope Scenarios of a Spring Bean


    We have the following example:

    @SpringBootApplication
    public class In28minutesScopeApplication {
    
        private static Logger LOGGER = LoggerFactory.getLogger(In28minutesScopeApplication.class);
    
        public static void main(String[] args) {
            // Application Context
            ApplicationContext applicationContext =
                    SpringApplication.run(In28minutesScopeApplication.class, args);
            PersonDAO personDAO = applicationContext.getBean(PersonDAO.class);
            PersonDAO personDAO1 = applicationContext.getBean(PersonDAO.class);
    
            LOGGER.info("{}", personDAO);
            LOGGER.info("{}", personDAO.getJdbcConnection());
    
            LOGGER.info("{}", personDAO1);
            LOGGER.info("{}", personDAO1.getJdbcConnection());
    
        }
    }
    @Component
    public class PersonDAO {
    
        @Autowired
        JDBCConnection jdbcConnection;
    
        public JDBCConnection getJdbcConnection() {
            return jdbcConnection;
        }
    
        public void setJdbcConnection(JDBCConnection jdbcConnection) {
            this.jdbcConnection = jdbcConnection;
        }
    }
    
    
    @Component
    public class JDBCConnection {
        public JDBCConnection () {
            System.out.println("JDBC Connection");
        }
    }

    The idea is to understand in different cases, how those instanse are created.

    Currently when running the application, we got:

    com.example.in28minutes.scope.PersonDAO@6c61a903
    com.example.in28minutes.scope.JDBCConnection@59d4cd39
    com.example.in28minutes.scope.PersonDAO@6c61a903 com.example.in28minutes.scope.JDBCConnection@59d4cd39

    Each class share the same instanse.

    What if we want that 'PersonDAO' using Singleton but JDBCConnection use 'Prototype'?

    @Component
    @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
    public class PersonDAO {
    
        @Autowired
        JDBCConnection jdbcConnection;
    
        public JDBCConnection getJdbcConnection() {
            return jdbcConnection;
        }
    
        public void setJdbcConnection(JDBCConnection jdbcConnection) {
            this.jdbcConnection = jdbcConnection;
        }
    }
    
    @Component
    @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class JDBCConnection {
        public JDBCConnection () {
            System.out.println("JDBC Connection");
        }
    }

    In the end, we got the same result:

    com.example.in28minutes.scope.PersonDAO@14008db3
    com.example.in28minutes.scope.JDBCConnection@16aa8654
    com.example.in28minutes.scope.PersonDAO@14008db3
    com.example.in28minutes.scope.JDBCConnection@16aa8654

    If we really want JDBCConnection use a different instance, we can add Proxy to it:

    @Component
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
    public class JDBCConnection {
        public JDBCConnection () {
            System.out.println("JDBC Connection");
        }
    }
  • 相关阅读:
    mysql 索引
    redis持久化
    redis发布订阅
    django 信号
    paramiko模块
    23种设计模式python实现
    几种浏览器存储数据的方式
    关于传参
    对字符串里的四则运算进行计算2020/10/12
    动手动脑2020/10/9
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10658915.html
Copyright © 2020-2023  润新知