自定义springboot-starter,实现自动配置,自定义注解扫描注入(类似dubb。。。

更新时间:2023-07-10 03:19:33 阅读: 评论:0

⾃定义springboot-starter,实现⾃动配置,⾃定义注解扫描注⼊
(类似dubb。。。
1. 简介
本⽂,⾃定义starter是为了扩展 之前⾃⼰写的⼀个RPC框架,所以本⽂的案列 就是在这个RPC框架之上,实现⾃动配置
传送门 :    |
博主现在想把这个 RPC框架封装成⼀个 starter,实现以下功能
1 .  在maven 引⼊对应starter 实现⾃动配置,yaml⽂件的参数⾃定义
2 . 在项⽬启动时,扫描 打了 ⾃定义注解  @ChyRPCRegist 的类,把他注册进 PRC 注册中⼼,同时使⽤ spring 提供的单例对象,进⾏反射调⽤
3 . 扫描 ⾃定义注解  @ChyRPCServiceFind 的接⼝(这⾥是接⼝,不是实现类,默认spring 的 @rvice是不扫描进容器的),然后偷龙换风,把代理对象扔给spring管理, 可以⽤ @Autowired,@Resource 注解注⼊后使⽤ , 类似 mybatis 的 starter;
最后⼀个⽐较⿇烦,博主都是看着 mybatis starter 的源码⼀步步摸过来.
==================================分割线==============================================
============
⽼规矩,先扔 github,这个项⽬依赖了,上⼀篇  ,要先下载对应的PRC框架,然后 maven 安装后才能正常使⽤
2 . starter 基本配置
(1 . 新建⼀个spring boot项⽬ 引⼊maven
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>            <optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<!--博主⾃⼰⼿写的RPC框架-->
<dependency>
<groupId>chy.frame.rpc</groupId>
<artifactId>chyrpc2.0</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>所有者权益
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
(2 .创建⼀个  Properties ⽤来映射 yaml上的配置⽂件
//在yaml⽂件中的前缀
@ConfigurationProperties(prefix="chyrpc")
public class RpcProperties {
private String zookeepeer = "127.0.0.1:2181";
private int port = 10086;
private String ip = "127.0.0.1";
prosperitypublic String getZookeepeer() {
return zookeepeer;
}
public void tZookeepeer(String zookeepeer) {
英语国际音标下载}
public int getPort() {
return port;
}
public void tPort(int port) {
this.port = port;
}
public String getIp() {metta
return ip;
}
public void tIp(String ip) {
this.ip = ip;
}
}
(3 创建⾃动配置类
北京联大应用文理学院
@Configuration
//必须要引⼊了我⼿写的 rpc框架才能⽣效
@ConditionalOnClass(ChyRpcApplication.class)
//能够读取我⾃定义的配置⽂件soffe
@EnableConfigurationProperties(RpcProperties.class)
public class ChyRpcAutoConfigure {
@Autowired
RpcProperties rpcProperties;
@Bean
//如果⽤户⾃定义了⼀个 ChyRpcApplication 就不创建,如果没有就在spring 容器中加⼊⼀个默认配置的rpc容器,ChyRpcApplication也是我RPC的核⼼类,类似 ssio    @ConditionalOnMissingBean(ChyRpcApplication.class)
public ChyRpcApplication initChyRpcApplication(){
ChyRpcApplication chyRpcApplication = new Zookeepeer());
chyRpcApplication.Port());
chyRpcApplication.Ip());
return chyRpcApplication;
}
}
(4  在 项⽬下创建spring.factories⽂件
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
chy.frame.spring.starter.rpc.autoConfigure.ChyRpcAutoConfigure
加⼊,要⾃动配置的 配置类.这样 当spring boot 引⼊该 starter后 就会⾃动加载 该类,然后根据那⼏个条件注解去加载对应⽅法(5 测试
当以上配完之后,打包,然后 新建⼀个 spring boot 项⽬,引⼊
<dependency>
野性的呼唤英文读后感
<groupId>chy.frame.spring.starter</groupId>
<artifactId>chyrpc-spring-boot-starter</artifactId>
<version>1.0</version>
</dependency>
这时候,在yaml⽂件中 就能输⼊我们添加的参数
输⼊端⼝ 为 7992, 启动项⽬后,看到 控制台
看来spring已经帮我们 把 ChyRpcApplication 放⼊ spring 容器了.
这时候,启动2个服务,⼀个注册服务,⼀个调⽤服务.
@RestController
public class Mycontroller {
@Autowired
public MyService myService;
@Autowired
public ChyRpcApplication chyRpcApplication;
@GetMapping("/regist")
public String regist() throws Exception {
return "注册成功";
}
@GetMapping("/test2")
public String test2() throws Exception {
ServiceApi rviceApi = Service("nameSB",ServiceApi.class);
st();
}
}
能看到,浏览器上显⽰,远程 服务器的⽅法调⽤后,最基本的 starter 就搭建 完了
bitch是什么意思>check out是什么意思
================================分割线 总结⼀波============================================
不过缺点也很明显,如果上千个 服务要注册,能写到崩溃,⽽且这么调⽤.spring 不能管理到 代理对象.每次 都是⼀个新的代理.
the karate kid
2 . 实现⾃动注册服务
这⾥ 我⾃定义了⼀个 注解
@ChyRPCRegist
凡是被这个 注解盯上的类,会在⾃动配置的时候,注册进RPC框架.
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ChyRPCRegist {
//有⼀个默认参数,将会指定 RPC服务的名称,如果不写,将会⽤这个类的接⼝的名称注册
String name() default "";
}
因为, RPC注册的时候,需要服务类的实例对象(总不能每次调⽤都去new⼀个) ,同时spring 已经帮我们管理好了,我们直接⽤ spring 管理的bean 对象就⾏.
所以思路就是,我们需要在 spring 把所有的 bean都创建好了,再去注册我们的服务.
spring 有各种监听 接⼝,这⾥ 我们使⽤  ApplicationListener<ContextRefreshedEvent>  这个接⼝,注意泛型才是关键
这个接⼝会在 bean全部创建完了才会调⽤.
那事情是很好办了,创建⼀个类

本文发布于:2023-07-10 03:19:33,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/172654.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:配置   注册   服务
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图