Spring5参考指南:基于注解的容器配置

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: Spring5参考指南:基于注解的容器配置

文章目录


Spring的容器配置可以有两种方式,一种基于XML文件, 一种基于注解。注解注入在XML注入之前执行。因此,当两个同时使用时,XML配置会覆盖注解注入的属性。

本文会主要介绍 @Required,@Autowired, @PostConstruct, @PreDestroy 和 @Resource 这几个注解。


这几个注解都是由 context:annotation-config/ 来引入的。本质上引入这个配置会隐式的注册AutoWiredAnnotationBeanPostProcessor(提供@Autowired),CommonAnnotationBeanPostProcessor(提供@PostConstruct, @PreDestroy, @Resource),RequiredAnnotationBeanPostProcessor(提供 @Required),从而提供各个注解的功能。


下面我们会分别介绍各个注解的功能。


@Required


@Required 一般用在方法上面,表示该方法的参数必须能通过配置或者自动装载来填充。通常如果某个属性是必须的,我们会使用这个注解。


不过从Spring Framework 5.1开始,@Required注解正式被弃用,取而代之的是使用构造函数注入用于所需的属性,或使用InitializingBean.afterPropertiesSet()的自定义实现以及bean属性setter方法。


示例代码如下:


public class RequiredBean {
    private BeanA  beanA;
    @Required
    public void setBeanA(BeanA beanA){
        this.beanA=beanA;
    }
}

@Autowired


@Autowired 就是自动注入所需要的字段,参数等。JSR 330的@Inject注解可以代替spring的@Autowired注解。


你可以将@Autowired注解到构造器中,如下所示:


public class AutowiredBean {
    private BeanA beanA;
    @Autowired
    public AutowiredBean(BeanA beanA){
        this.beanA=beanA;
    }
}


从SpringFramework4.3开始,如果目标bean只定义了一个构造函数,那么就不再需要在此类构造函数上使用@Autowired注解。但是,如果有多个构造函数可用,则必须至少对其中一个进行注解,以告诉容器使用哪一个。


@Autowired也可以注解到传统的setter方法,如下例子所示:


public class AutowiredBean {
    private BeanB beanB;
    @Autowired
    public void setBeanB(BeanB beanB){
        this.beanB=beanB;
    }
}


也可以把注解应用到任何名字和多个参数,如下所示:


@Autowired
    public void configAB(BeanA beanA , BeanB beanB){
        this.beanA=beanA;
        this.beanB=beanB;
    }


@Autowired也可以用在字段上,如下所示:


@Autowired
    private BeanC beanC;


还可以通过将注解添加到需要该类型数组的字段或方法,那么可以从ApplicationContext中获取到该特定类型的所有bean,如下例所示:


@Autowired
    private BeanC[] beanCList;


如果希望数组或列表中的项按特定顺序排序,目标bean可以实现


org.springframework.core.Ordered接口,或者可以使用@Order或标准的@Priority注解。


否则,它们的顺序遵循容器中相应目标bean定义的注册顺序。


Map实例也可以被注入,只要key是String类型。Map value包括了所有的类型匹配的Bean,keys是该bean的名字。如下所示:


@Autowired
    public void configMapA(Map<String,BeanA> mapA){
    this.mapA=mapA;
    }


@Autowired有个required属性,如果要注入的bean有可能不存在,则可以如下所示:


@Autowired(required = false)
    public void setBeanC(BeanC beanC){
    }


建议使用@Autowired的’required’属性而不是使用setter方法上的@Required注解。“required”属性表示自动装载需要该属性, 如果无法自动装载,则忽略该属性。而对于@Required来说,如果未定义任何值,则会报异常。


也可以通过Java 8的java.util.Optional表示特定依赖项的非必需性质,如下示例显示:


@Autowired
    public void setMovieFinder(Optional<BeanC> BeanC) {
    }


在Spring Framework 5.0中,你也可以使用@Nullable注解:


@Autowired
    public void setMovieFinderC(@Nullable BeanC beanC) {
    }


Spring可以使用@Autowired来自动解析一些默认存在的bean如:BeanFactory、ApplicationContext、Environment、ResourceLoader、ApplicationEventPublisher和MessageSource。这些接口及其扩展接口(如ConfigurableApplicationContext或ResourcePatternResolver)。


如下所示,自动注入ApplicationContext:


@Autowired
    private ApplicationContext context;


注意: @Autowired, @Inject, @Value, 和 @Resource 注解是在Spring的BeanPostProcessor中处理的,这意味着你不能将这些注解用在你自己的BeanPostProcessor,BeanFactoryPostProcessor类型。


@primary


当按类型注入的时候,可能会有多个候选项,则可以通过@Primary注解表示优先的对象。如下所示:


@Configuration
public class ConfigBean {
    @Bean
    @Primary
    public BeanA firstBeanA() { return new BeanA(); }
    @Bean
    public BeanA secondBeanA() {  return new BeanA();}
}


@Qualifier


@Primary是一种在多个实例中按类型使用自动装载的有效方法,但是如果你希望对注入的Bean进行更细粒度的控制时候,可以使用@Qualifier。如下所示:


@Bean
    @Qualifier("main")
    public BeanC beanC() {  return new BeanC();}


@Autowired
    @Qualifier("main")
    private BeanA beanA;
    @Autowired
    public void setBeanA(@Qualifier("main") BeanA beanA){
    }


限定符的值并不是唯一的,它只是一个过滤标准。


@Autowired一般用来通过类型匹配,@Resource则是通过名称匹配。


也可以创建自定义注解:


@Target({ElementType.FIELD, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Genre {
        String value();
}


泛型


除了@Qualifier注解外,还可以使用Java泛型类型作为隐式的限定形式。例如,假设您具有以下配置:


public class StringStore implements Store<String> {
}
public class IntegerStore implements Store<Integer> {
}


@Bean
    public StringStore stringStore() {
        return new StringStore();
    }
    @Bean
    public IntegerStore integerStore() {
        return new IntegerStore();
    }


public class GenericBean {
    @Autowired
    private Store<String> s1; // <String> qualifier, injects the stringStore bean
    @Autowired
    private Store<Integer> s2; // <Integer> qualifier, injects the integerStore bean
    // Inject all Store beans as long as they have an <Integer> generic
    // Store<String> beans will not appear in this list
    @Autowired
    private List<Store<Integer>> s;
}


@Resource


@Resource用在字段或者Setter方法上,默认情况下@Resource通过名字来注入。


public class ResourceBean {
    @Resource(name = "beanA")
    private BeanA BeanA;
}


如果未显式指定名称,则从字段名或setter方法派生默认名称.


在@Resource用法中,如果没有指定显式名称,并且类似于@Autowired,@Resource会找到一个主类型匹配,而不是指定的bean,并解析已知的可解析依赖项:BeanFactory、ApplicationContext、ResourceLoader、ApplicationEventPublisher,和MessageSource接口。


@PostConstruct和@PreDestroy


这两个注解主要用做生命周期回调。如下所示:


public class ConstructBean   {
    @PostConstruct
    public void populateMovieCache() {
        // populates the movie cache upon initialization...
    }
    @PreDestroy
    public void clearMovieCache() {
        // clears the movie cache upon destruction...
    }
}


与@Resource一样,@PostConstruct和@PreDestroy注解类型是JDK 6到8标准Java库的一部分。然而,整个javax.annotation包与JDK 9中的核心Java模块分离,并最终在JDK 11中被删除。如果需要,javax.annotation-api工件现在需要通过maven central获得,只需像其他库一样添加到应用程序的类路径中即可。


相关文章
|
4天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
20 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
28天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
35 0
|
22天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
14天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
27 1
|
29天前
|
Java 测试技术 Windows
咦!Spring容器里为什么没有我需要的Bean?
【10月更文挑战第11天】项目经理给小菜分配了一个紧急需求,小菜迅速搭建了一个SpringBoot项目并完成了开发。然而,启动测试时发现接口404,原因是控制器包不在默认扫描路径下。通过配置`@ComponentScan`的`basePackages`字段,解决了问题。总结:`@SpringBootApplication`默认只扫描当前包下的组件,需要扫描其他包时需配置`@ComponentScan`。
|
7天前
|
Kubernetes 监控 Java
如何在Kubernetes中配置镜像和容器的定期垃圾回收
如何在Kubernetes中配置镜像和容器的定期垃圾回收
|
30天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
123 1
|
2月前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
210 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
30天前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
65 0