Solon 特性简集,相较于 Springboot 有什么区别? (2)

通过语义特性,为Bean增加特性描述;从而实现一些附加的能力

// // 一个数据主从库的示例 // @Configuration public class Config { //申明 db2 是 db1 为的从库 @Bean(value = "db1", attrs = { "slaves=db2" }) public DataSource db1(@Inject("${test.db1}") HikariDataSource dataSource) { return dataSource; } @Bean("db2") public DataSource db2(@Inject("${test.db2}") HikariDataSource dataSource) { return dataSource; } } 7、支持数据渲染(或输出格式化)的自我控制支持

定制特定场景的控制器基类,负责统一格式化输出

//示例:定制统一输出控制基类,并统一开启验证 // @Valid public class ControllerBase implements Render { @Override public void render(Object obj, Context ctx) throws Throwable { if (obj == null) { return; } if (obj instanceof String) { ctx.output((String) obj); } else { if (obj instanceof ONode) { ctx.outputAsJson(((ONode) obj).toJson()); } else { if (obj instanceof UapiCode) { //此处是重点,把一些特别的类型进行标准化转换 // UapiCode err = (UapiCode) obj; obj = Result.failure(err.getCode(), UapiCodes.getDescription(err)); } if (obj instanceof Throwable) { //此处是重点,把异常进行标准化转换 // Throwable err = (Throwable) obj; obj = Result.failure(err.getMessage()); } ctx.outputAsJson(ONode.stringify(obj)); } } } } 8、不基于Servlet,却很有 Servlet 亲和度。当使用servlet相关的组件时(也支持jsp + tld)

支持 ServletContainerInitializer 配置

@Configuration public class DemoConfiguration implements ServletContainerInitializer{ @Override public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException { //... } }

支持 Servlet api 注解

@WebFilter("/demo/*") public class DemoFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException { res.getWriter().write("Hello,我把你过滤了"); } } 9、为服务开发而生的SockeD组件,实现http,socket,websocket相同的信号处理。

支持MVC+RPC开发模式

//[服务端] @Mapping(value = "/demoe/rpc", method = MethodType.SOCKET) @Component(remoting = true) public class HelloRpcServiceImpl implements HelloRpcService { public String hello(String name) { return "name=" + name; } } //[客户端] var rpc = SocketD.create("tcp://localhost:28080", HelloRpcService.class); System.out.println("RPC result: " + rpc.hello("noear"));

支持单链接双向RPC开发模式(基于上例扩展)

//[服务端] @Mapping(value = "/demoe/rpc", method = MethodType.SOCKET) @Component(remoting = true) public class HelloRpcServiceImpl implements HelloRpcService { public String hello(String name) { // //[服务端] 调用 [客户端] 的 rpc,从而形成单链接双向RPC // NameRpcService rpc = SocketD.create(Context.current(), NameRpcService.class); name = rpc.name(name); return "name=" + name; } }

支持消息发送+监听开发模式

//[服务端] @ServerEndpoint public class ServerListener implements Listener { @Override public void onMessage(Session session, Message message) { if(message.flag() == MessageFlag.heartbeat){ System.out.println("服务端:我收到心跳"); }else { System.out.println("服务端:我收到:" + message); //session.send(Message.wrapResponse(message, "我收到了")); } } } //[客户端] var session = SocketD.createSession("tcp://localhost:28080"); session.send("noear"); //session.sendAndCallback("noear", (rst)->{}); //发送并异常回调 //var rst = session.sendAndResponse("noear"); //发送并等待响应 System.out.println(rst);

支持消息订阅开发模式

//[客户端] @ClientEndpoint(uri = "tcp://localhost:28080") public class ClientListener implements Listener { @Override public void onMessage(Session session, Message message) { //之后,就等着收消息 System.out.println("客户端2:我收到了:" + message); } } 10、专属RPC客户端组件:Nami

类似于Springboot + Feign的关系,但Nami更简洁(Solon 也可以用Feign)

//[定义接口],一般情况下不需要加任何注解 // public interface UserService { UserModel getUser(Integer userId); } //[服务端] Component.remoting = true,即为组件开启远程服务 // @Mappin("user") @Component(remoting = true) 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("local:/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"; } } 11、Solon的加强版SPI扩展机制 - 以增加注解为例

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsfsdz.html