zoukankan      html  css  js  c++  java
  • 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);
        }    
    }
    
  • 相关阅读:
    快速幂
    三角函数与反三角函数的使用
    poj1050 dp动态规划
    归并排序算法
    KMP算法(查找子序列)
    hdu1233 继续畅通工程 (最小生成树——并查集)
    set<pair<int,int> > 的运用
    HDU 4513 吉哥系列故事――完美队形II (manacher算法)
    Codeforces Round #360 (Div. 2) C. NP-Hard Problem (BFS)
    Codeforces Round #357 (Div. 2) C.Heap Operations 优先队列 + 模拟
  • 原文地址:https://www.cnblogs.com/noear/p/13489732.html
Copyright © 2011-2022 走看看