Spring启动应用程序上下文和子上下文作为单独的上下文

时间:2016-02-20 15:10:23

标签: spring-boot

我想在我的应用程序中使用不同的子api模块。我的要求是

  1. 我想使用春季靴子。
  2. 父母和子女的背景应该彼此分开。
  3. 我应该可以在不同的上下文中使用相同的名称服务。
  4. 我想将一些对象从父上下文传递给子上下文,如DataSource。
  5. 实现这一目标的最佳方法是什么。

    感谢。

    行。我尝试了你的建议,我得到了System.out.println(“Parent:”+ count);打印,但我没有得到打印System.out.println(“Child:”+ count);

    此代码有什么问题?

    EDITED

    @Configuration
    public class SpringBootChildApplication {
    
    
    }
    
    
    @Configuration
    @EnableConfigurationProperties 
    public class ChildDataConfig {
    
        @Autowired
        DataSource dataSource;
    
        @Bean
        JdbcTemplate jdbcTemplate(DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }
    
    @Service
    public class ChildDataService {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        @PostConstruct
        void executeSql() {
            String sql = "select 5 as cnt from dual";
            Object[] listParams = {};
            Integer count = jdbcTemplate.queryForObject(sql, listParams, new RowMapper<Integer>() {
                @Override
                public Integer mapRow(ResultSet rs, int number) throws SQLException {
                    return rs.getInt("cnt");
                }
            });
    
            System.out.println("Child: " + count);
        }
    }
    
    @SpringBootApplication
    public class SpringBootParentApplication {
    
        public static void main(String[] args) {
            // SpringApplication.run(SpringBootParentApplication.class, args);
            new SpringApplicationBuilder().bannerMode(Banner.Mode.OFF).sources(SpringBootParentApplication.class)
                    .child(SpringBootChildApplication.class).run(args);
        }
    }
    
    @Service
    class ParentDataService {
    
        @Autowired
        JdbcTemplate jdbcTemplate;
    
        @Autowired
        ChildDataService childDataService;
    
        @PostConstruct
        void executeSql() {
            String sql = "select 5 as cnt from dual";
            Object[] listParams = {};
            Integer count = jdbcTemplate.queryForObject(sql, listParams, new RowMapper<Integer>() {
                @Override
                public Integer mapRow(ResultSet rs, int number) throws SQLException {
                    return rs.getInt("cnt");
                }
            });
    
            System.out.println("Parent: " + count);
    
            childDataService.executeSql();
        }
    }
    
    
    @Configuration
    @EnableConfigurationProperties 
    public class ParentDataConfig {
    
        @ConfigurationProperties(prefix = "datasource.custom")
        @Bean
        public DataSource dataSource() {
            return DataSourceBuilder.create().build();
        }
    
        @Bean
        JdbcTemplate jdbcTemplate(DataSource dataSource) {
            return new JdbcTemplate(dataSource);
        }
    }
    

1 个答案:

答案 0 :(得分:2)

2.您可以在SpringBootApplication中设置子上下文和父上下文: new SpringApplicationBuilder() .bannerMode(Banner.Mode.OFF) .sources(Parent.class) .child(Application.class) .run(args); https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-spring-application.html#boot-features-fluent-builder-api

3.Beans可以工作(没有尝试),父母只会看到在父上下文中创建的bean。 孩子将在其上下文中看到bean,如果找不到则将查看父上下文。 因此,如果父级和子级上下文中存在具有相同名称的bean,则父级将在父级中查看bean,在子级上下文中查看子级。

4.不必在子上下文中传输bean,如果它在父上下文中,子上下文中的其他bean可以看到它。

我想知道根据后处理器会出现问题。例如。 @EnableJpaRepositories因为它们可能导致丢失或双豆..

你是否看到了 System.out.println(“Parent:”+ count) 要么 System.out.println(“Child:”+ count) 取决于您呼叫服务的位置。如果调用是由父上下文中的bean发出的(这就是你的内容),它将在父上下文中使用bean。 由子上下文中的bean调用,使用子上下文中的bean。