Solon Ioc 的註解對比Spring及JSR330

註解對比

Solon 1.0.10 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時有效

部分用例說明

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);
    }    
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章