zoukankan      html  css  js  c++  java
  • [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");
        }
    }
  • 相关阅读:
    【Hadoop学习之十三】MapReduce案例分析五-ItemCF
    【Hadoop学习之十二】MapReduce案例分析四-TF-IDF
    【Hadoop学习之十】MapReduce案例分析二-好友推荐
    【Hadoop学习之九】MapReduce案例分析一-天气
    【Hadoop学习之十一】MapReduce案例分析三-PageRank
    RPC(Remote Procedure Calls)远程过程调用
    基于java开源区块链Blockchain相关项目介绍
    按 file 分组统计视图 | 全方位认识 sys 系统库
    内存分配统计视图 | 全方位认识 sys 系统库
    按 host 分组统计视图 | 全方位认识 sys 系统库
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10658915.html
Copyright © 2011-2022 走看看