Spring 5 中文解析核心篇-IoC容器之JSR330标准注解

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本章节主要描述:Spring 5 中文解析核心篇-IoC容器之JSR330标准注解。
1.11 使用JSR330标准注解

Spring3.0开始,Spring提供对JSR-330标准注解的支持(依赖注入)。这些注解和Spring注解一样的方式被扫描。去使用它们,你需要在类路径中依赖相关的jar包。

如果你使用Maven,javax.inject组件在标准的Maven仓库中(https://repo1.maven.org/maven2/javax/inject/javax.inject/1/)是有效的。你可以添加下面的依赖到你的pom.xml:

<dependency>
 <groupId>javax.inject</groupId>
 <artifactId>javax.inject</artifactId>
 <version>1</version>
</dependency>
1.11.1 @Inject@Named依赖注入

你可以使用@javax.inject.Inject替代@Autowired,类似下面例子:

import javax.inject.Inject;

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    public void listMovies() {
        this.movieFinder.findMovies(...);
        // ...
    }
}

类似@Autowired注解,你可以在字段级别、方法级别、构造参数级别使用@Inject。此外,你可以将注入点声明为Provider,从而允许按需访问范围较短的bean,或者通过提供程序get()调用对其他bean进行延迟访问。下面例子提供前面子例子变体:

import javax.inject.Inject;
import javax.inject.Provider;

public class SimpleMovieLister {

    private Provider<MovieFinder> movieFinder;

    @Inject
    public void setMovieFinder(Provider<MovieFinder> movieFinder) {
        this.movieFinder = movieFinder;
    }

    public void listMovies() {
        this.movieFinder.get().findMovies(...);
        // ...
    }
}

如果你喜欢为应该被注入的依赖使用限定名称,你应该使用@Named注解,类似下面的例子显示:

import javax.inject.Inject;
import javax.inject.Named;

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(@Named("main") MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...
}

类似@Autowired@Inject也能使用java.util.Optional@Nullable。这在这里更适用,因为@Inject没有required属性。下面两个例子展示怎样去使用@Inject@Nullable

public class SimpleMovieLister {

    @Inject
    public void setMovieFinder(Optional<MovieFinder> movieFinder) {
        // ...
    }
}
public class SimpleMovieLister {

    @Inject
    public void setMovieFinder(@Nullable MovieFinder movieFinder) {
        // ...
    }
}

参考代码:com.liyong.ioccontainer.starter.XmlInjectAndNamedIocContainer

1.11.2 @Named@ManagedBean:等价于@Component

代替@Component,你可以使用@javax.inject.Namedjavax.annotation.ManagedBean,类似下面的例子:

import javax.inject.Inject;
import javax.inject.Named;

@Named("movieListener")  // @ManagedBean("movieListener") could be used as well
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...
}

在没有指定组件名称的情况下使用@Component是非常常见的。@Named可以类似的方式使用,类似下面例子:

import javax.inject.Inject;
import javax.inject.Named;

@Named
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...
}

使用@Named@ManagedBean时,可以使用与使用Spring注解完全相同的方式来使用组件件扫描。类似下面例子展示:

@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig  {
    // ...
}

@Component相比,JSR330@Named和JSR-250 ManagedBean注解是不能被组合的。你应该使用Spring的构造型模型来构建自定义组件注解。

参考代码:com.liyong.ioccontainer.starter.XmlNamedAndManagerBeanIocContainer

1.11.3 JSR-330标准注解的限制

当你使用标准注解时,你应该知道一些重要特性不可用,类似下面表格展示:

Spring javax.inject.* javax.inject restrictions / comments
@Autowired @Inject @Inject没有 required属性. 能够使用在Java8的 Optional
@Component @Named / @ManagedBean JSR-330不提供可组合的模型,仅提供一种识别命名组件的方法。
@Scope("singleton") @Singleton JSR-330 默认作用域是 Spring的 prototype. 然而, 为了保存与Spring的一般默认一致性, 在Spring容器中JSR-330bean默认被声明为一个singleton。为了使用其他的作用域,你应该使用Spring的@Scope注解。javax.inject也提供一个@Scope注解。不过,此仅用于创建自己的注解。
@Qualifier @Qualifier / @Named javax.inject.Qualifier是构建自定义限定符元注解. 具体的 String 限定通过javax.inject.Named关联。 (类似Spring的 @Qualifier 值)
@Value - no equivalent
@Required - no equivalent
@Lazy - no equivalent
ObjectFactory Provider javax.inject.Provider是Spring的ObjectFactory的直接替代,仅仅有一个get()方法名,它也可以与Spring的@Autowired结合使用,也可以与无注释的构造函数和setter方法结合使用。

作者

个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。

博客地址: http://youngitman.tech

CSDN: https://blog.csdn.net/liyong1028826685

微信公众号:

技术交流群:

目录
相关文章
|
27天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
48 0
|
22天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
60 2
|
1月前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
56 4
SpringBoot必须掌握的常用注解!
|
12天前
|
前端开发 Java Spring
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
27 2
|
29天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
35 0
|
1月前
|
存储 安全 Java
springboot当中ConfigurationProperties注解作用跟数据库存入有啥区别
`@ConfigurationProperties`注解和数据库存储配置信息各有优劣,适用于不同的应用场景。`@ConfigurationProperties`提供了类型安全和模块化的配置管理方式,适合静态和简单配置。而数据库存储配置信息提供了动态更新和集中管理的能力,适合需要频繁变化和集中管理的配置需求。在实际项目中,可以根据具体需求选择合适的配置管理方式,或者结合使用这两种方式,实现灵活高效的配置管理。
17 0
|
25天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
80 2
|
1天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
114 77
|
3天前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
22 3
|
15天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
43 5

推荐镜像

更多