Solon v3.0.4

A、“四种”注解能力定制汇总(AOP/IOC)

</> markdown

注解能力的“四种”划分:

注解划分能力注册接口示例注解类型扩展能力归属
构建注解(加在类上的注解)beanBuilderAdd@Controller支持IOC
注入注解(加在类、字段、参数上的注解)beanInjectorAdd@Inject支持IOC
拦截注解(加在函数上的注解)beanInterceptorAdd@Tran/AOP
提取注解(加在函数上的注解)beanExtractorAdd@CloudJob/AOP

注解能力的注册,要在容器扫描之前完成(否则就错过时机了,应用生命周期可以再看看)。常见的注册时间为:

  • 应用启动初始化时
public class App{
    public static void main(String[] args){
        Solon.start(App.class, args, app->{
            //例
            app.context().beanBuilderAdd(...);
        });
    }
} 
  • 插件启动时
public class PluginImpl implements Plugin{
    @Override
    public void start(AppContext context) {
        //例
        context.beanBuilderAdd(...);
    }
}

1、定义构建能力注解,比如 @Controller

注解类:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Controller {
}

注解类能力注册:

//注册 @Controller 构建器
context.beanBuilderAdd(Controller.class, (clz, bw, anno) -> {
    //内部实现,可参考项目源码
    Solon.app().factoryManager().mvcFactory().createLoader(bw).load(Solon.app());
});

应用示例:

@Controller
public class DemoController{
    @Mapping("/hello")
    public String hello(){
        return "Hello world!";
    }
}

2、定义字段或参数注入能力的注解,比如 @Inject

注解类:

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Inject {
    String value() default "";
    boolean required() default true;
    boolean autoRefreshed() default false;
}

注解类能力注册:

//注册 @Inject 注入器
context.beanInjectorAdd(Inject.class, ((vh, anno) -> {
    //内部实现,可参考项目源码
    beanInject(vh, anno.value(), anno.required(), anno.autoRefreshed());
}));

应用示例:

@Component
public class DemoService{
    //注入字段
    @Inject
    UserMapper userMapper;
}

@Configuration
public class DemoConfig{
    //注入到参数。只支持与:@Bean 配合
    @Bean
    public DataSource ds(@Inject("${db1}") HikariDataSource ds){
        return ds;
    }
}

3、定义函数拦截能力的注解,比如 @Tran

注解类:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Tran {
    TranPolicy policy() default TranPolicy.required;
    TranIsolation isolation() default TranIsolation.unspecified;
    boolean readOnly() default false;
}

注解类能力注册:

 //内部实现,可参考项目源码
context.beanInterceptorAdd(Tran.class, new TranInterceptor(), 120);

应用示例:

@Component
public class DemoService{
    //注入字段
    @Inject
    UserMapper userMapper;
    
    @Tran
    public void addUser(User user){
        userMapper.add(user);
    }
}

4、定义函数提取能力的注解,比如:@CloudJob

注解类:

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CloudJob {
    @Alias("name")
    String value() default "";
    @Alias("value")
    String name() default "";
    String cron7x() default "";
    String description() default "";
}

注解类能力注册:

 //内部实现,可参考项目源码
context.beanExtractorAdd(CloudJob.class, CloudJobExtractor.instance);

应用示例:

@Component
public class JobController{
    @CloudJob(name="user.stat", cron7x="0 0/1 * * * ? *")
    public void userStatJob(){
        //...
    }
}