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");
        }
    }
  • 相关阅读:
    23种设计模式
    iOS中 判断对象类型的一些方法
    iOS 反射获取类的属性列表
    CATransition--(2)
    CATransition
    App Extension编程指南(iOS8/OS X v10.10):常见问题的处理方案
    触摸、手势与响应者链条
    NSTimer使用
    监控数据库运行
    MS AX 技术相关网站收藏
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10658915.html
Copyright © 2011-2022 走看看