侵入,无侵入? Annotation vs Interface

全面认识微服务探针原理 随着微服务架构的兴起,应用行为的复杂性显著提高,为了提高服务的可观察性,分布式监控系统变得十分重要。 基于 Google 的 Dapper 论文,发展出了很多有名的监控系统:Zipkin、Jaeger、Skywalking 以及想一统江湖的 OpenTelemetry 等。一众厂家和开源爱好者围绕着监控数据的采集、收集、存储以及展示做出了不少出色的设计。 时至今日即使是个人开发者也能依赖开源产品,轻松的搭建一套完备的监控系统。但作为监控服务的提供者,必须... 阅读详情
1. Interface 
   使用Interface 定义对象的类型,框架根据对象的接口来提供服务,这种模式是古而有之的Java框架设计者必习之法,从最重量的EJB到最轻量的Spring,都离不开这种方式,也的确解决了很多问题。比如在大家熟悉的Spring里: 
  • BeanFactoryAware接口,框架看到它就会调用Bean的setBeanFactory(BeanFactory beanFactory) 函数,将BeanFactory传给它,让它自行用BeanFactory获得更多Bean,而不仅限于依赖注入的Bean。
  • FactoryBean接口,框架看到它就不会把这个Bean放入自己的Context,而是调用它的getObject()函数,将返回的结果作为Bean放入。Spring里很多功能依赖于这个扩展机制,因为它可以用Factory模式返回任意类型对象,而不是<bean class="foo">中class指定类型。
  • InitializingBean接口,因为很多Bean在各setter注入后,还需要一个总的init函数进行初始化,比如需要同时根据注入的属性A和 B,来初始化属性C的值。这时候框架就会调用afterPropertiesSet() 初始化。

        等等,最后一个InitializingBean接口很邪恶阿!!硬要POJO实现一个名字怪怪的afterPropertiesSet()函数,侵入得不能再侵入阿。 


2. 无侵入 
        所以,Spring提供了另一种方式,在配置文件里定义初始方法的名字: 

Java代码   收藏代码
  1. <bean class="foo" init-method="init"/>  
        其实Spring提倡的无侵入有两种层次: 

        一种是像Quartz,JMX,WebService这些模块,POJO啥都不用做,Spring使用AOP,FactoryBean这样的机制使它们白日飞升变为WebService,或者具有定时执行的能力。 

        一种是像init-method的例子,POJO并不很明显的实现Spring的接口,知觉Spring的存在,自己实现自己的函数,然后由Spring的配置文件去调用它们。 

        前一种无侵入的作用非常明显,后一种的意义就看具体的场景了,有时候实现一下Spring的接口也没什么所谓,但有时候各种原因会希望不显式的实现接口。 

 3. Annotation    
      在JDK5新增了Annotation的模式。Annotation 是XML配置模式的竞争者,但题目太大本篇就不讨论了,个人观点是主要看数据属于配置数据还是代码元数据。 

      本文forcus Interface vs Annotation来定义对象类型和行为。最开始用Annotation 使Java代码不再那么受传统模式局限的是TestNG,然后JUnit 4紧跟其后,在默认机制之外,可以用annotation 来灵活定义setup函数和测试函数。

   4. 对比演示 
  下面,我们以SpringSide里的UndeleteEntity接口和@Undelete 标识的实现,具体演示一下两者。 

  项目需求是如果把Entity对象定义为不能删除,Dao基类的remove函数就不会真正删除该对象,而是设置状态列为"无效"。 

Interface是这样实现的: 
Interface 定义: 

Java代码   收藏代码
  1. public interface UndeletableEntity {  
  2.     void setStatus(String status);  
  3. }Interface 在Entity使用:  
  4.   
  5. public class Book implements UndeletableEntity {  
  6.   private String status;  public void setStatus(String status) {  
  7.    this.status = status;  
  8.   }  
  9.  }  

Interface 在框架中使用: 

Java代码   收藏代码
  1. //根据Class 判断  
  2. if(UndeletableEntity.class.isAssignableFrom(Book.class)){  
  3.     ...  
  4. }  
  5. //根据Bean实体判断  
  6. if(bookinstanceof UndeletableEntity{  
  7.    ((UldeletableEntity)bean).setStatus("-1");  
  8. }  


    大家都很熟悉的写法,就不解释了。 

Annotation是这样实现的: 
   Annotation 定义: 

Java代码   收藏代码
  1. @Target({ElementType.TYPE})  
  2. @Retention(RetentionPolicy.RUNTIME)  
  3. public @interface Undeletable {  
  4.   String status() default "status";  
  5. }  
   原本怪Sun怎么这么抠门,用@interface 而不另外搞一个关键字,原来Sun的意思就是把Interface和Annotation的定位一样呀。 

   @Target 定义Annotation 可用在什么地方,比如类型,函数,函数参数等。Type代表Class,Interface... 

   @Retention(RetentionPolicy.RUNTIME)表明是个运行期的annotation,否则后面的代码就不会起作用了。 

   String status() 定义了annotation有个status的属性,而且可以定义默认值为 "status"。 

   Annotation在Entity使用: 

Java代码   收藏代码
  1. @Undeletable  
  2.   public class Book{  
  3.     private String status;  
  4.      public void setStatus(String status) {  
  5.         this.status = status;  
  6.      }  
  7.   }   
  8.   
  9. @Undeletable(status = "status2")  
  10.     public class BookWithNewStatus {  
  11.     private String status2;  
  12.     public void setStatus2(String status2) {  
  13.         this.status2 = status2;  
  14.     }  
  15. }   


在框架中的判断: 

Java代码   收藏代码
  1. if (entityClass.isAnnotationPresent(Undeletable.class)) {  
  2.     Undeletable anno = (Undeletable) entityClass.getAnnotation(Undeletable.class);  
  3.     statusProperty = anno.status();  
  4. }  

   可见,annotation的模式,比interface要少一点侵入性,不规定死status列的名称,而且还可以灵活定义更多元属性,比如定义无效时的值为"-1","unvalid"。 

   但是,这种模式也和所有动态的东西向一样,失去了编译期校验的优势,POJO如果没有setStatus() 这个函数在编译期也检查不出来。 

   BTW.标题太长了,其实也属于幼学琼林系列,show一下用interface 和 annotation 定义元数据,交给框架去反射的基本写法。 
2021年秋招面经分享·字节跳动【芯片工程师-系统架构】 前言 如果想参考本人背景情况的可见这篇概述 ============================ 正文开始 ============================== 【时间线】 7.29 字节一面 8.4 字节二面 8.11 字节三面 PS:红字表示我当时没答出来的问题,蓝字表示面试官的解答。 面经分享 一面·技术面【1小时5分钟】   面试官京腔重,聊high了所以没时间撕代码了,但是华为应该不会这样。 自我介绍; 介绍一下APB; APB中3个状态的跳转是怎么跳转的; AXI中va 阅读详情

相关推荐

Hypermesh二次开发实战:Tcl命令分类与常用函数详解(附避坑指南)

本文深入解析Hypermesh二次开发中Tcl命令的三大核心类别:界面命令、查询命令与修改命令。重点剖析了*createmark集合管理与hm_getvalue信息查询等关键函数的实战用法,并提供了避免Mark覆盖、生命周期管理等常见陷阱的实用指南,旨在帮助CAE工程师构建高效可靠的自动化前处理流程。

weixin_29233333的博客 242

istio 之 sidecar 注入 Webhook

Istio通过对serviceMesh中的每个pod注入sidecar,来实现无侵入式的服务治理能力。 sidecar的注入是其能力实现的重要一环(在kubernetes集群中的注入方式)。sidecar注入有两种方式, 一是通过创建webhook资源,利用k8s的webhook能力实现pod的自动注入, 二是通过istioctl工具,对yaml文件进行手动注入。 https://istio.io...

誓言 1763

BAPI创建委外采购订单

使用BAPI BAPI_PO_CREATE1创建委外采购订单,组件为手工输入时,有几个点需要注意: 1、已通过CS01创建过BOM的物料,创建时会自动带出components。如果要修改当前组件清单,可以通过设置pocomponents-change_id = 'E’来实现 lv_sline = lv_sline + 1. ls_pocomponents-po_item = l_ebelp + 10. ls_pocomponents-ITEM_NO = l

Buffalo_soldier的博客 3265

无侵入式和有侵入式动作类

1.无侵入式动作类 在代码中无法直接看出和struts2的关系 举一个简单的例子 2.有侵入式动作类 可以看出代码和struts的关系。 (1)实现Action接口 (2)ActionSupport类 默认方法,什么方法都不写时默认的方法...

qq_42057046的博客 672

CATIA CAA开发环境搭建避坑指南:从授权服务到VS配置全流程

本文提供了一份详尽的CATIA CAA开发环境搭建避坑指南,涵盖从授权服务(DSLS)安装、Visual Studio版本匹配与集成配置,到编译调试全流程。重点解析了授权服务无法连接、模块加载失败等典型问题的解决方案,强调版本严格对应与纯英文环境是成功搭建的关键。

redis7keeper的博客 574

DSSAT模型建模教程

随着数字农业和智慧农业的发展,基于过程的作物生长模型(Process-based Crop Growth Simulation Model)在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。现有版本V4.7能模拟27种主要农作物的生长发育和产量形成过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。如果你是个模型入门者,这次将让你体验一键模拟的乐趣。

weixin_55561616的博客 1414

[转载]侵入,无侵入? Annotation vs Interface

侵入,无侵入? Annotation vs Interface1. Interface   使用Interface 定义对象的类型,框架根据对象的接口来提供服务,这种模式是古而有之的Java框架设计者必习之法,从最重量的EJB到...

congji3817的博客 154

叶绿体基因组提交NCBI全流程避坑指南

叶绿体基因组作为环状细胞器DNA,其数据提交并非简单上传,而是需严格遵循INSDC标准的学术出版行为。其核心原理在于元数据完整性、拓扑结构语义一致性与分类学路径精确匹配;技术价值体现在保障序列可追溯、可复现、可互操作;典型应用场景涵盖植物系统发育、条形码开发及合成生物学底盘构建。实践中,FASTA头行格式、feature table嵌套规则、taxid绑定及BankIt静默校验等环节极易引发失败。本文聚焦NCBI|叶绿体基因组数据上传中的高频报错与隐性约束,提供面向生物信息工程师的实操级规范解析。

weixin_31960565的博客 330

Annotation vs Interface

 作者:江南白衣 本文出自SpringSide wiki,请留意Wiki中的最新版本。 1. Interface   使用Interface 定义对象的类型,框架根据对象的接口来提供服务,这种模式是古而有之的Java框架设计者必习之法,从最重量的EJB到最轻量的Spring,都离不开这种方式,也的确解决了很多问题。比如在大家熟悉的Spring里: BeanFact

1043

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 461

基于ComfyUI+H3的本地化竖屏短剧自动化生成工作流

本文介绍了一种基于ComfyUI和MiniMax H3的本地化竖屏短剧自动化生成工作流。该方案通过纯机械读取分镜总纲表格,实现从文本到视频的全自动生成,支持多人同框稳定输出、人脸一致性保持、音视频同步生成等功能。工作流包含图像生成、人工审核、视频生成和音频处理四个核心环节,采用本地化部署方案避免云端服务的限制和成本问题。文章详细说明了环境部署步骤、必需的自定义节点安装以及显存优化配置,特别针对16GB显存设备提供了量化压缩、GPU独占调度等技术方案,确保系统流畅运行。

huanghm88的专栏 331

Java下的框架编程(4)--Annotation vs XML vs Interface 最新一Round

作者:江南白衣 1.因为两者的用途不同,所以Annotation与XML应该并存 Anootation vs XML 到了现在,在Spring和EJB3各占一边的持续演示下,各自的用途已清晰。   虽然两者之间完全可以相互替代,没有绝对不能做的事情,但却存在好不好的问题,两者的用途不同,应该并用:   "size=10,db_user=ito"这样的参数,仍然适合放在XML,YAML(ruby),

花钱的年华 2617

ASP.NET Core 6 Web API在IIS上的部署与调试

通过以上步骤和配置,你应该能够成功部署并调试你的ASP.NET Core 6 Web API在IIS上。记住,权限和配置是关键,确保你的环境和应用程序代码都正确设置。希望这篇博客对你部署和解决IIS上的问题有所帮助。

m0_74337424的博客 522
上一篇: java注解 1
下一篇: Hibernate
mpconfig
博客等级 码龄17年 22粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值