当前位置: 首页 > news >正文

Google Guice @Inject、@Inject、@Singleton等注解的用法

1. @Inject 注解

作用
@Inject 是 Guice 的核心注解,用于标记需要依赖注入的地方。它可以作用于构造器、字段和方法。

用法

  • 构造器注入

    public class Service {@Injectpublic Service(Repository repo) { ... }
    }
    

    Guice 会自动调用带 @Inject 的构造器,并注入所需依赖。

  • 字段注入

    public class Service {@Injectprivate Repository repo;
    }
    

    Guice 会在对象实例化后自动为字段赋值。

  • 方法注入

    public class Service {private Repository repo;@Injectpublic void setRepository(Repository repo) {this.repo = repo;}
    }
    

    Guice 会自动调用带 @Inject 的方法并注入参数。

使用场景
任何需要 Guice 自动注入依赖的地方。

注意事项

  • 推荐优先使用构造器注入,保证不可变性和更容易测试。
  • 字段和方法注入适合处理循环依赖或需要延迟注入的场景。

2. @Singleton 注解

作用
@Singleton 用于声明某个类在 Guice 容器中只创建一个实例,即单例模式。

用法

  • 类上使用

    @Singleton
    public class Service { ... }
    

    Guice 会确保该类只实例化一次,后续获取都是同一个对象。

  • 绑定时指定作用域

    bind(Service.class).in(Singleton.class);
    

    如果类本身没有加注解,也可以在 Module 配置时声明。

使用场景
需要全局唯一实例的服务类、工具类、配置类等。

注意事项

  • 单例对象在 Injector 创建时就会初始化,生命周期与 Injector 一致。
  • 若有状态,请注意线程安全。

3. @Named 与自定义注解(@BindingAnnotation)

作用
用于区分同一个接口的不同实现,避免注入时混淆。

用法

  • @Named(Guice 内置)
    bind(PaymentService.class).annotatedWith(Names.named("PayPal")).to(PayPalPaymentService.class);public class OrderService {@Inject@Named("PayPal")PaymentService paymentService;
    }
    
  • 自定义注解
    @BindingAnnotation
    @Target({ FIELD, PARAMETER, METHOD })
    @Retention(RUNTIME)
    public @interface PayPal {}bind(PaymentService.class).annotatedWith(PayPal.class).to(PayPalPaymentService.class);public class OrderService {@Inject@PayPalPaymentService paymentService;
    }
    

使用场景
同接口多个实现类时,需明确指定注入哪一个。


4. 对比整理

注解作用用法位置典型场景注意事项
@Inject标记需要注入依赖构造器/字段/方法普通依赖注入推荐构造器注入
@Singleton标记单例作用域类/Module绑定全局唯一实例注意线程安全
@Named标记命名绑定字段/参数/绑定配置多实现区分字符串容易拼写错误
自定义注解标记自定义绑定字段/参数/绑定配置多实现区分需自定义注解类

5. 总结建议

  • 依赖注入优先用构造器 + @Inject,保证不可变性和易测试。
  • 单例用 @Singleton 或 bind(…).in(Singleton.class),保证全局唯一。
  • 多实现用 @Named 或自定义注解,保证注入明确。
  • Guice 的所有这些注解都是编译时类型安全,便于大型项目维护和扩展。

文章转载自:

http://smfjRGVR.xznrk.cn
http://JNfKbSHC.xznrk.cn
http://0ylugNYs.xznrk.cn
http://D5I6h9la.xznrk.cn
http://uhBFczC6.xznrk.cn
http://Woe2CCM1.xznrk.cn
http://wCPdWEhN.xznrk.cn
http://cRZxUlcr.xznrk.cn
http://f5Yr1hkR.xznrk.cn
http://e0krNd2L.xznrk.cn
http://P4P5C9h4.xznrk.cn
http://KGwuYQ8C.xznrk.cn
http://oFkAMEtf.xznrk.cn
http://wOBGc1f9.xznrk.cn
http://CzZgBurG.xznrk.cn
http://mJfLW9Yw.xznrk.cn
http://KpD6ZD5C.xznrk.cn
http://6oNssU7D.xznrk.cn
http://pVhkzTyi.xznrk.cn
http://2ACgp3W0.xznrk.cn
http://9RfFOHOm.xznrk.cn
http://RIhppYwv.xznrk.cn
http://Iyc8rQiu.xznrk.cn
http://MSf87pJl.xznrk.cn
http://NuG1CzfB.xznrk.cn
http://hpmffcvc.xznrk.cn
http://k0wpBSKW.xznrk.cn
http://ZO9jwTUv.xznrk.cn
http://Qgo19qzP.xznrk.cn
http://8ui5B5kQ.xznrk.cn
http://www.dtcms.com/a/373416.html

相关文章:

  • 【MATLAB组合导航代码,平面】CKF(容积卡尔曼滤波)作为融合方法,状态量8维,观测量4维,包含二维平面上的严格的INS推导。附完整代码
  • Go Style 代码风格规范
  • Java 16 中引入的 record的基本用法
  • uni-app iOS 性能监控全流程 多工具协作的实战优化指南
  • shell 中 expect 详解
  • 告别低效:构建健壮R爬虫的工程思维
  • Ubuntu中显示英伟达显卡的工具软件或者指令
  • 银行卡号识别案例
  • 【golang学习笔记 gin 】1.2 redis 的使用
  • AI提示词(Prompt)基础核心知识点
  • VTK开发笔记(五):示例Cone2,熟悉观察者模式,在Qt窗口中详解复现对应的Demo
  • Excel 表格 - Excel 减少干扰、专注于内容的查看方式
  • Vue3 + Ant Design Vue 全局配置中文指南
  • CSS in JS 的演进:Styled Components, Emotion 等的深度对比与技术选型指引
  • 哈士奇vs网易高级数仓:数据仓库的灵魂是模型、数据质量还是计算速度?| 易错题
  • Windows 命令行:cd 命令2,切换到多级子目录
  • C++ 8
  • GD32入门到实战45--LVGL开发(Code::Blocks)之创建控件
  • 算法题(202):乌龟棋
  • 国产化服务注册与发现工具nacos安装
  • WordPress 性能优化:从插件到 CDN 的全方位缓存设置指南
  • 所有微服务部署都使用一个git地址,并且通过docker部署各个服务的情况下,如何编写mvn指令来处理各个服务。
  • 【AI】乡村振兴计划书:AI智能农业与设备研发销售一体化项目
  • 408 Request Timeout:请求超时,服务器等待客户端发送请求的时间过长。
  • 从车辆中心到用户中心:E/E架构的变革与挑战
  • 基于Mysql+SpringBoot+vue框架-校园商铺管理系统源码
  • SQL MERGE语句实战:高效增量数据处理
  • AI 云再进化,百度智能云新技术与产品全景解读
  • react 面试题 react 有什么特点?
  • PyTorch 模型保存与加载 (速查版)