Solon詳解系列文章:
Solon詳解(一)- 快速入門
Solon詳解(二)- Solon的核心
Solon詳解(三)- Solon的web開發
Solon詳解(四)- Solon的事務傳播機制
Solon詳解(五)- Solon擴充套件機制之Solon Plugin
Solon詳解(六)- Solon的校驗擴充套件框架使用與擴充套件
Solon詳解(七)- Solon Ioc 的註解對比Spring及JSR330
註解對比
Solon 1.0.27 | Spring | JSR 330 | |
---|---|---|---|
@XInject * | @Autowired | @Inject | 注入Bean(by type) |
@XInject("name") | @Qualifier+@Autowired | @Qualifier+@Inject | 注入Bean(by name) |
@XInject("${name}") | @Value("${name}") | - | 注入配置 |
@XBean * | @Component | @Named | 託管Bean |
@XSingleton | @Scope(“singleton”) | @Singleton | 單例(Solon 預設是單例) |
@XSingleton(false) | @Scope(“prototype”) | - | 非單例 |
@XEvent | - | - | 內部事件訂閱 |
@XInit * | @PostConstruct | - | 構造完成並注入後的初始化 |
@XConfiguration | @Configuration | - | 配置類 |
@XController | @Controller,@RestController | - | 控制器類 |
@XMapping | @RequestMapping,@GetMapping... | - | 對映 |
- Solon 的 @XInject 算是: Spring 的@Value、@Autowired、@Qualifier 三者的結合,但又不完全等價
- Solon 託管的 Bean 初始化順序:new() - > @XInject - > @XInit -> Method@XBean
- 注1:Method@XBean,只執行一次(只在 @XConfiguration 裡有效)
- 注2:@XInject 的引數注入,只在Method@XBean上有效
- 注3:@XInject 的型別注入,只在@XConfiguration類上有效
部分用例說明
Solon 強調有節制的註解使用,尤其對於增加處理鏈路的操會比較節制。
- @XBean(Bean的託管:基於 name 或者 型別;且只記錄第一次的註冊)
@XBean
public class UserService{
@Db("db1") //@Db為第三方擴充套件的注入註解
BaseMapper<User> mapper;
UserModel getUser(long puid){
return db1.selectById(puid);
}
}
/* @XBean("userService")
public class UserService{
@Db("db1")
BaseMapper<User> mapper;
UserModel getUser(long puid){
return db1.selectById(puid);
}
} */
- @XController
@XSingleton(false) //非單例註解
@XController
public class UserController{
@XInject("${message.notnull}")
String message;
@XInject
UserService userService
@XMapping("/user/{puid}")
public Object user(Long puid){
if(puid == null){
return message;
}
return userService.getUser(puid);
}
}
- @XConfiguration
@XConfiguration
public class Config {
@XBean("db1")
public DbContext db1(@XInject("${test.db1}") HikariDataSource dataSource) {
String schema = XApp.cfg().get("test.db1.schema");
return new DbContext(schema, dataSource);
}
}
- @XEvent (使用事件監聽時,要確保有人發起事件)
//系統異常監聽(這個系統會發的,還可以監聽不同的異常)
//
@XEvent(Throwable.class)
public class ThrowableListener implements XEventListener<Throwable> {
WaterLogger log = new WaterLogger("rock_log");
@Override
public void onEvent(Throwable err) {
XContext ctx = XContext.current();
if (ctx != null) {
String _in = ONode.stringify(ctx.paramMap());
log.error(ctx.path(), _in, err);
}
}
}
//Bean擴充套件監聽(為Mybatis配置類,新增外掛)
//
@XEvent(Configuration.class)
@XConfiguration
public class SqlHelperMybatisAutoConfiguration implements XEventListener<Configuration> {
//...
@Override
public void onEvent(Configuration configuration) {
SqlHelperMybatisPlugin plugin = new SqlHelperMybatisPlugin();
//...
configuration.addInterceptor(plugin);
}
}