美文网首页
Solon详解(七)- Solon Ioc 的注解对比Sprin

Solon详解(七)- Solon Ioc 的注解对比Sprin

作者: 草编椅 | 来源:发表于2020-09-14 12:46 被阅读0次

    Solon详解系列文章:
    Solon详解(一)- 快速入门
    Solon详解(二)- Solon的核心
    Solon详解(三)- Solon的web开发
    Solon详解(四)- Solon的事务传播机制
    Solon详解(五)- Solon扩展机制之Solon Plugin
    Solon详解(六)- Solon的校验框架使用、定制与扩展
    Solon详解(七)- Solon Ioc 的注解对比Spring及JSR330
    Solon详解(八)- Solon的缓存框架使用和定制
    Solon详解(九)- 渲染控制之定制统一的接口输出

    注解对比

    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);
        }    
    }
    

    相关文章

      网友评论

          本文标题:Solon详解(七)- Solon Ioc 的注解对比Sprin

          本文链接:https://www.haomeiwen.com/subject/xslzsktx.html