Springboot mini - Solon詳解(七)- Solon Ioc 的註解對比Spring及JSR330

Springboot min -Solon 詳解系列文章:
Springboot mini - Solon詳解(一)- 快速入門
Springboot mini - Solon詳解(二)- Solon的核心
Springboot mini - Solon詳解(三)- Solon的web開發
Springboot mini - Solon詳解(四)- Solon的事務傳播機制
Springboot mini - Solon詳解(五)- Solon擴展機制之Solon Plugin
Springboot mini - Solon詳解(六)- Solon的校驗框架使用、定製與擴展
Springboot mini - Solon詳解(七)- Solon Ioc 的註解對比Spring及JSR330
Springboot mini - Solon詳解(八)- Solon的緩存框架使用和定製
Springboot mini - Solon詳解(九)- 渲染控制之定製統一的接口輸出
Springboot mini - Solon詳解(十)- 怎麼用 Solon 開發基於 undertow jsp tld 的項目?html

註解對比

Solon Spring JSR 330
@Inject * @Autowired @Inject 注入Bean(by type)
@Inject("name") @Qualifier+@Autowired @Qualifier+@Inject 注入Bean(by name)
@Inject("${name}") @Value("${name}") - 注入配置
@Component @Component @Named 託管組件
@Singleton @Scope(「singleton」) @Singleton 單例(Solon 默認是單例)
@Singleton(false) @Scope(「prototype」) - 非單例
@Init * @PostConstruct - 構造完成並注入後的初始化
@Configuration @Configuration - 配置類
@Bean @Bean 配置組件
@Mapping @RequestMapping,@GetMapping... - 映射
@Controller @Controller,@RestController - 控制器類
@Service @Service - 服務類
@Dao @Dao - 數據訪問類
  • Solon 的 @Inject 算是: Spring 的@Value、@Autowired、@Qualifier 三者的結合,但又不徹底等價
  • Solon 託管的 Bean 初始化順序:new() - > @Inject - > @Init
  • 注1:Method@Bean,只執行一次(只在 @Configuration 裏有效)
  • 注2:@Inject 的參數注入,只在Method@Bean上有效
  • 注3:@Inject 的類型注入,只在@Configuration類上有效

部分用例說明

Solon 強調有節制的註解使用,尤爲對於增長處理鏈路的操會比較節制。java

  • @Component(組件託管:基於 name 或者 類型;且只記錄第一次的註冊)
@Component
public class UserService{
    @Db("db1")    //@Db爲第三方擴展的注入註解
    BaseMapper<User> mapper;
    
    UserModel getUser(long puid){
        return db1.selectById(puid);
    }
}

/* @Component("userService")
public class UserService{
    @Db("db1") 
    BaseMapper<User> mapper;
    
    UserModel getUser(long puid){
        return db1.selectById(puid);
    }
} */
  • @Controller
@Singleton(false)    //非單例註解
@Controller
public class UserController{
    @Inject("${message.notnull}")
    String message;
    
    @Inject
    UserService userService
    
    @Mapping("/user/{puid}")
    public Object user(Long puid){
        if(puid == null){
            return message;
        }
        return userService.getUser(puid);
    }
}
  • @Configuration
@Configuration
public class Config {
    @Bean("db1")
    public DataSource db1(@Inject("${test.db1}") HikariDataSource ds) {
        return ds;
    }
}

//系統異常監聽(這個系統會發的,還能夠監聽不一樣的異常)
//
@Configuration
public class ThrowableListener implements EventListener<Throwable> {
    WaterLogger log = new WaterLogger("rock_log");

    @Override
    public void onEvent(Throwable err) {
        Context ctx = Context.current();

        if (ctx != null) {
            String _in = ONode.stringify(ctx.paramMap());

            log.error(ctx.path(), _in, err);
        }
    }
}

//Bean擴展監聽(爲Mybatis配置類,添加插件)
//
@Configuration
public class  SqlHelperMybatisAutoConfiguration implements EventListener<Configuration> {

    //...
    
    @Override
    public void onEvent(Configuration configuration) {
       SqlHelperMybatisPlugin plugin = new SqlHelperMybatisPlugin();
       //...
       configuration.addInterceptor(plugin);
    }    
}

附:Solon項目地址

相關文章
相關標籤/搜索