我想在我的应用程序中使用不同的子api模块。我的要求是
实现这一目标的最佳方法是什么。
感谢。
行。我尝试了你的建议,我得到了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);
}
}
答案 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。