重识Java动态代理(二)Spring中声明式编程实现

本文探讨了声明式编程的好处,如代码简洁和隐藏实现细节,并介绍了在Spring中应用声明式编程来实现远程调用的示例。通过EnableRestClients注解开启功能,使用RestClient、RestClientPath等注解声明远程接口和方法。同时,详细解释了RestClientsRegistrar、RestClientFactoryBean、RestClientProxyFactory和RestClientProxy的作用,展示了如何通过动态代理实现接口类的远程调用。
摘要由CSDN通过智能技术生成

一、声明式编程的好处

声明式编程的好处有:

  1. 代码简洁,不需要写很多相同的实现代码
  2. 对使用者屏蔽了实现细节,使用者只需要声明要做什么,而不关心怎么做。

二、适用场景

声明式编程适合封装公共的,不涉及业务逻辑的基础服务,例如远程调用,数据库访问。

三、Spring中声明式编程的实现

下面看一个在Spring中通过声明式编程实现远程访问的Demo,Demo类结构如下:

  1. EnableRestClients是一个Spring的启动类注解,用来声明是否要开启此功能,如果有此注解则开启,否则不开启。
  2. RestClient是要声明的远程接口的类注解,用来声明这些接口是否要实现远程调用。
  3. RestClientPath是要声明的远程接口的方法注解,用来声明该方法要调用的远程地址。
  4. RestClientsRegistrar是一个注册类,作用是动态注册远程接口的实现类。
  5. RestClientFactoryBean是一个工厂Bean,作用是将远程接口的实现作为一个Bean注册到Spring中。
  6. RestClientProxyFactory是一个代理工厂,用于生成远程接口的代理类。
  7. RestClientProxy是远程接口的代理类,调用远程接口方法时,实际调用的是代理类。

下面看下代码:
1.EnableRestClients.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(RestClientsRegistrar.class)
public @interface EnableRestClients {
   

	/**
	 * 要扫描的接口类的包名
	 * 
	 * @return
	 */
	String[] basePackages() default {
   };

}

2.RestClient.java

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

}

3.RestClientPath.java

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface RestClientPath {
   

	/**
	 * 出于示例简单考虑,只有一个远程访问地址URL
	 * 
	 * @return
	 */
	String url() default "";
}

4.RestClientsRegistrar核心代码

	public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
   
		ClassPathScanningCandidateComponentProvider scanner = getScanner();
		scanner.setResourceLoader(this.resourceLoader);

		System.out.println("this.resourceLoader: " + this.resourceLoader);


		// 添加一个注解过滤器,有RestClient注解的类/接口才继续处理
		AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(RestClient.class);
		scanner.addIncludeFilter(annotationTypeFilter);

		// 这里的metadata是spring启动类上的注解元数据,下面这一步是获取EnableRestClients注解的属性
		Map
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值