A、“四种”注解能力定制汇总(AOP/IOC)
注解能力的“四种”划分:
注解划分 | 能力注册接口 | 示例注解 | 类型扩展 | 能力归属 |
---|---|---|---|---|
构建注解(加在类上的注解) | 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(){
//...
}
}