Solon2 开发之IoC,二、构建一个 Bean 的三种方式
1、手动
简单的构建:
//生成普通的Bean
Solon.context().wrapAndPut(UserService.class, new UserServiceImpl());
//生成带注解的Bean(比如:@Controller)
Solon.context().beanMake(UserServiceImpl.class);
更复杂的手动,以适应特殊的需求:
UserService bean = new UserServiceImpl();
//可以进行手动字段注入
Solon.context().beanInject(bean);
//可以再设置特殊的字段
bean.setXxx("xxx");
//包装Bean(指定名字的)
BeanWrap beanWrap = Solon.context().wrap("userService", bean);
//包装Bean(指定类型的)
//BeanWrap beanWrap = Solon.context().wrap(UserService.class, bean);
//以名字注册
Solon.context().putWrap("userService", beanWrap);
//以类型注册
Solon.context().putWrap(UserService.class, beanWrap);
下面2种模式,必须要被扫描到。在不便扫描,或不须扫描时手动会带来一种自由感。
2、用配置器类
本质是 @Configuration + @Bean 的组合,并且 Config 要被扫描到
@Configuration
public class Config{
//以类型进行注册(默认) //可用 @Inject(UserService.class) 注入
@Bean
public UserService build(){
return new UserServiceImpl();
}
//以名字进行注册 //可用 @Inject("userService") 注入
//@Bean("userService")
//public UserService build2(){
// return new UserServiceImpl();
//}
//同时以名字和类型进行注册 //支持类型或名字注入
//@Bean(name="userService", typed=true)
//public UserService build2(){
// return new UserServiceImpl();
//}
}
使用带条件的构建
@Configuration
public class Config{
@Bean
public CacheService cacheInit(@Inject("${cache.enable}") boolean enable,
@Inject("${cache.config}") CacheServiceSupplier supper){
if(enable){
return supper.get();
}else{
return null;
}
}
}
顺带,还可以借用 @Configuration + @Bean 的组合,进行初始化
@Configuration
public class Config{
@Bean
public void titleInit(@Inject("${demo.title}") String title){
Config.TITLE = title;
}
@Bean
public void dsInit(@Inject("${demo.ds}") String ds) {
String[] dsNames = ds.split(",");
for (String dsName : dsNames) {
Props props = Solon.cfg().getProp("demo.db-" + dsName);
if (props.size() > 0) {
//按需创建数据源
DataSource db1 = props.getBean("", HikariDataSource.class);
//手动推到容器内
BeanWrap bw = Solon.context().wrap(DataSource.class, db1);
Solon.context().putWrap(dsName, bw);
}
}
}
}
//
// 相对于 @Init 的区别:@Bean 是在容器扫描时执行的;@Init 是在容器扫描完成后后执行的。
//
3、使用组件注解(必须要能被扫描到)
a. 以类型进行注册(默认)
@Component
public class UserServiceImpl implements UserService{
}
//通过 @Inject(UserService.class) 注入
//通过 Solon.context().getBean(UserService.class) 手动获取 //要确保组件已注册
b. 以名字进行注册
@Component("userService")
public class UserServiceImpl implements UserService{
}
//通过 @Inject("userService") 注入
//通过 Solon.context().getBean("userService") 手动获取 //要确保组件已注册
c. 以名字和类型同时进行注册
@Component(name="userService", typed=true)
public class UserServiceImpl implements UserService{
}
//通过 @Inject("userService") 注入
//通过 Solon.context().getBean("userService") 手动获取 //要确保组件已注册
//通过 @Inject(UserService.class) 注入
//通过 Solon.context().getBean(UserService.class) 手动获取 //要确保组件已注册