前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring与JDK注入

Spring与JDK注入

原创
作者头像
疯狂的KK
发布2024-05-06 14:39:37
890
发布2024-05-06 14:39:37
举报
文章被收录于专栏:AI绘画Java项目实战AI绘画

引言

在Java开发的世界里,依赖注入(Dependency Injection,简称DI)是实现控制反转(Inversion of Control,简称IoC)的一种方式。它允许我们通过外部配置来管理对象之间的依赖关系,从而提高代码的可维护性和可测试性。Spring框架和JDK的注入机制是实现依赖注入的两种常见方式。本文将深入探讨Spring自动注入和JDK注入的区别,以及如何在实际开发中应用这些技术,并对对象字段进行非空校验。

Spring自动注入与JDK注入的区别

Spring自动注入

Spring框架通过注解(如@Autowired@Inject@Resource等)来实现依赖注入。Spring容器会自动扫描并注入带有这些注解的字段或方法。

注解总结
  • @Autowired:自动装配,默认情况下要求依赖对象必须存在,如果需要允许null值,可以设置它的required属性为false。
  • @Inject:与@Autowired类似,但它是Java依赖注入规范(JSR-330)的一部分。
  • @Resource:通过名称来装配,如果没有指定名称,则会使用字段名或方法名作为默认名称。
源码解析

Spring的自动注入是通过AutowiredAnnotationBeanPostProcessor来实现的,它会处理带有@Autowired@Inject@Value等注解的字段和方法。

JDK注入

JDK的注入是通过@Inject注解来实现的,它是Java依赖注入规范(JSR-330)的一部分。

注解总结
  • @Inject:与Spring的@Autowired类似,但它是Java依赖注入规范(JSR-330)的一部分。
源码解析

JDK的注入是通过Injection类来实现的,它会处理带有@Inject注解的字段和方法。

实战代码Demo

Spring自动注入实战

代码语言:java
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyService {
    private final Dependency dependency;

    @Autowired
    public MyService(Dependency dependency) {
        this.dependency = dependency;
    }

    // ...
}

JDK注入实战

代码语言:java
复制
import javax.inject.Inject;

public class MyService {
    private final Dependency dependency;

    @Inject
    public MyService(Dependency dependency) {
        this.dependency = dependency;
    }

    // ...
}

对象字段校验非空

在实际开发中,我们经常需要对对象的字段进行非空校验。Spring框架提供了@NotNull注解来实现这一功能。

代码语言:java
复制
import javax.validation.constraints.NotNull;

public class MyObject {
    @NotNull
    private String field;

    // ...
}
@Autowired的使用场景
  • 当一个类需要依赖另一个类时,可以使用@Autowired注解来自动注入依赖。
  • 当需要注入一个集合或数组时,可以使用@Autowired注解配合@Qualifier@Primary来指定具体的实现。
@Autowired的运行原理

当Spring容器启动时,AutowiredAnnotationBeanPostProcessor会遍历所有的bean定义,对于每个bean,它会检查其属性和方法上是否有@Autowired注解。如果有,它会尝试找到合适的bean来注入。

JDK注入的深入解析

JDK的注入是基于Java依赖注入规范(JSR-330)的,它定义了一套标准的注解来实现依赖注入。@Inject注解是这个规范的核心,它与Spring的@Autowired类似,但它是Java标准的一部分。

@Inject的使用场景
  • 当需要遵循Java标准的依赖注入时,可以使用@Inject注解。
  • 当需要在不同的依赖注入框架之间保持一致性时,@Inject是一个好的选择。
@Inject的运行原理

JDK的注入是通过Injection类来实现的,它会处理带有@Inject注解的字段和方法。当容器启动时,它会查找所有带有@Inject注解的字段和方法,并尝试注入合适的依赖。

对象字段校验非空的深入解析

在Spring框架中,对象字段的非空校验是通过@NotNull注解来实现的。这个注解是Bean Validation API的一部分,它允许我们在运行时对对象的字段进行校验。

@NotNull的使用场景
  • 当需要确保对象的某个字段不为空时,可以使用@NotNull注解。
  • 当需要在对象创建或更新时进行字段校验时,@NotNull是一个很好的选择。
@NotNull的运行原理

当Spring容器创建或更新一个对象时,它会检查对象的字段是否带有@NotNull注解。如果字段为空,容器会抛出一个异常,提示字段非空校验失败。

实战代码Demo

Spring自动注入实战

代码语言:java
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class MyService {
     private final Dependency dependency;

     @Autowired
     public MyService(Dependency dependency) {
         this.dependency = dependency;
     }

     // ...
}

JDK注入实战

代码语言:java
复制
import javax.inject.Inject;

public class MyService {
     private final Dependency dependency;

     @Inject
     public MyService(Dependency dependency) {
         this.dependency = dependency;
     }

     // ...
}

对象字段校验非空实战

代码语言:java
复制
import javax.validation.constraints.NotNull;

public class MyObject {
     @NotNull
     private String field;

     // ...
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • Spring自动注入与JDK注入的区别
    • Spring自动注入
      • 注解总结
      • 源码解析
    • JDK注入
      • 注解总结
      • 源码解析
  • 实战代码Demo
    • Spring自动注入实战
      • JDK注入实战
        • @Autowired的使用场景
        • @Autowired的运行原理
    • 对象字段校验非空
      • JDK注入的深入解析
        • @Inject的使用场景
        • @Inject的运行原理
      • 对象字段校验非空的深入解析
        • @NotNull的使用场景
        • @NotNull的运行原理
    • 实战代码Demo
      • Spring自动注入实战
        • JDK注入实战
          • 对象字段校验非空实战
          相关产品与服务
          容器服务
          腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
          http://www.vxiaotou.com