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");
        }
    }
  • 相关阅读:
    40 +必不可少的前端Web开发备忘单
    web前端开发必读的HTML5的书籍
    Java String的内存机制
    使用C#通过Oracle.DataAccess连接Oracle,部署时需要注意版本问题
    CI(CodeIgniter)的"Disallowed Key Characters."异常处理
    开源软件许可协议简介
    读《考拉小巫的英语学习日记》有感
    vi的复制、粘贴、查找、删除等常用命令
    读《马云创业启示录》有感
    jQuery ajax 同步失效?
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10658915.html
Copyright © 2011-2022 走看看