@Component
public class DemoCom {
private B b;
public void setB(@Inject B b){
this.b = b;
}
}
支持的(字段,或构造器参数,或小豆方法参数):
java复制代码
@Component
public class DemoCom {
private final A a;
@Inject
private B b;
public Demo(A a){
this.a = a;
}
}
@Configuration
public class DemoConfig{
@Bean
public void a(A a) {
//...
}
}
6、Solon 可以更自由获取配置
java复制代码
@Component
public class Demo{
//注入配置
@Inject("${user.name}")
private String userName;
//手动获取配置
private String userName = Solon.cfg().get("user.name");
}
7、Solon 配置注解结构体
java复制代码
@Inject("${user.config}")
@Configuration
public class UserConfig{
public String name;
public List<String> tags;
...
}
//别处可以注入复用
@Inject
UserConfig userConfig;
8、与 Springboot 相似的事务支持 @Transaction
采用 Springboot 相同的事件传播机制及隔离级别。但回滚时,不需要指定异常类型
java复制代码
@Controller
public class DemoController{
@Db
BaseMapper<UserModel> userService;
@Transaction
@Mapping("/user/update")
public void udpUser(long user_id, UserModel user){
userService.updateById(user);
}
}
//[定义接口],一般情况下不需要加任何注解
//
public interface UserService {
UserModel getUser(Integer userId);
}
//[服务端] @Remoting,即为远程组件
//
@Mappin("user")
@Remoting
public class UserServiceImpl implements UserService{
public UserModel getUser(Integer userId){
return ...;
}
}
//[消费端]
//
@Mapping("demo")
@Controller
public class DemoController {
//直接指定服务端地址
@NamiClient("http://localhost:8080/user/")
UserService userService;
//使用负载均衡
@NamiClient(name="local", path="/user/")
UserService userService2;
@Mapping("test")
public void test() {
UserModel user = userService.getUser(12);
System.out.println(user);
user = userService2.getUser(23);
System.out.println(user);
}
}
/**
* 定义一个负载器(可以对接发现服务)
* */
@Component("local")
public class RpcUpstream implements LoadBalance {
@Override
public String getServer() {
return "http://localhost:8080";
}
}
14、Solon 的加强版 Spi 扩展机制 - 具备可编程性
新建模块,并实现Plugin接口(以增加 @AuthLogined 注解支持为例)
java复制代码
public class XPluginImpl implements Plugin {
@Override
public void start(AppContext context) {
context.beanInterceptorAdd(AuthLogined.class, new LoginedInterceptor());
}
}
Solon.context().beanBuilderAdd(Controller.class, (clz, bw, anno) -> {
//内部实现,可参考项目源码 //构建器,可以获取类型并进行加工
new HandlerLoader(bw).load(Solon.global());
});
//效果
@Controller
public class DemoController{
}
注册'注入器'处理。以注册 @Inject 注入器为例:
java复制代码
Solon.context().beanInjectorAdd(Inject.class, ((fwT, anno) -> {
//内部实现,可参考项目源码 //注入器,可以根据目标生成需要的数据并赋值
beanInject(fwT, anno.value(), anno.autoRefreshed());
}));
//效果
@Controller
public class DemoController{
@Inject
UserService userService;
}
注册'拦截器'处理。以注册 @Transaction 拦截器为例:
java复制代码
//拦截器,可以获取执行动作链
Solon.context().beanInterceptorAdd(Tran.class, new TranInterceptor(), 120);
//效果
@Component
public class UserService{
@Transaction
public void addUser(User user){
}
}
注册'提取器'处理。以注册 @CloudJob 提取器为例:
java复制代码
//内部实现,可参考项目源码 //提取器,可以提取被注解的函数
Solon.context().beanExtractorAdd(CloudJob.class, CloudJobExtractor.instance);
//效果 //提取器只对组件有效
@Component
public class Job{
@CloudJob
public void statUserJob(){
}
}