Spring条件注解用法案例分析

 更新时间:2019年11月13日 11:08:36   作者:cakincqm  
这篇文章主要介绍了Spring条件注解用法,结合具体实例形式分析了Spring条件注解相关原理、使用方法及操作注意事项,需要的朋友可以参考下

本文实例讲述了Spring条件注解用法。分享给大家供大家参考,具体如下:

一 点睛

Spring 4 提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解。

@Conditional根据满足仅一个特定条件创建一个特定的Bean。也就是根据特定的条件来控制Bean的创建行为,这样就可以利用这个特性进行一些自动的配置。

二 项目说明

以不同的操作系统为条件,通过实现@Condition接口,并重写matches方法来构造条件。若在windows系统下运行,则输出列表命令为dir;若在Linux操作系统下运行程序,则输出列表命令为ls。

三 实战

1 判断条件定义

1.1 windows的判定条件

package com.wisely.highlight_spring4.ch3.conditional;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class WindowsCondition implements Condition {
 public boolean matches(ConditionContext context,
   AnnotatedTypeMetadata metadata) {
  return context.getEnvironment().getProperty("os.name").contains("Windows");
 }
}

1.2 Linux的判定条件

package com.wisely.highlight_spring4.ch3.conditional;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class LinuxCondition implements Condition {
 public boolean matches(ConditionContext context,
   AnnotatedTypeMetadata metadata) {
  return context.getEnvironment().getProperty("os.name").contains("Linux");
 }
}

2 不同系统下的Bean类

2.1 接口

package com.wisely.highlight_spring4.ch3.conditional;
public interface ListService {
  public String showListCmd();
}

2.2 Window下创建的Bean类

package com.wisely.highlight_spring4.ch3.conditional;
public class WindowsListService implements ListService {
  @Override
  public String showListCmd() {
   return "dir";
  }
}

2.3 Linux下所创建的Bean类

package com.wisely.highlight_spring4.ch3.conditional;
public class LinuxListService implements ListService{
  @Override
  public String showListCmd() {
   return "ls";
  }
}

3 配置类

package com.wisely.highlight_spring4.ch3.conditional;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConditionConifg {
 @Bean
 @Conditional(WindowsCondition.class) //符合window条件,则实例化WindowsListService
 public ListService windowsListService() {
  return new WindowsListService();
 }
 @Bean
 @Conditional(LinuxCondition.class) //符合Linux条件,则实例化LinuxListService
 public ListService linuxListService() {
  return new LinuxListService();
 }
}

4 主类

package com.wisely.highlight_spring4.ch3.conditional;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
  public static void main(String[] args) {
   AnnotationConfigApplicationContext context =
    new AnnotationConfigApplicationContext(ConditionConifg.class);
   ListService listService = context.getBean(ListService.class);
   System.out.println(context.getEnvironment().getProperty("os.name")
     + "系统下的列表命令为: "
     + listService.showListCmd());
   context.close();
  }
}

四 运行

windows下运行结果如下:

Windows 10系统下的列表命令为: dir

五 扩展

如果把LinuxCondition条件改成和WindowsCondition一样的条件会怎样呢?即有两个条件都匹配会怎样呢?

修改后的代码如下:

public class LinuxCondition implements Condition {
 public boolean matches(ConditionContext context,
   AnnotatedTypeMetadata metadata) {
  return context.getEnvironment().getProperty("os.name").contains("Windows");
 }
}

修改后再运行,报错了:

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.wisely.highlight_spring4.ch3.conditional.ListService] is defined: expected single matching bean but found 2: linuxListService,windowsListService
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:365)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
    at com.wisely.highlight_spring4.ch3.conditional.Main.main(Main.java:11)

报错信息很明显:

[com.wisely.highlight_spring4.ch3.conditional.ListService] is defined: expected single matching bean but found 2: linuxListService,windowsListService

匹配到了两条,所以针对条件判断,设计程序时,只能匹配上一条,否则会抛异常。

更多关于java相关内容感兴趣的读者可查看本站专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • JAVA DOC如何生成标准的JAVA API文档详解

    JAVA DOC如何生成标准的JAVA API文档详解

    这篇文章主要给大家介绍了关于JAVA DOC如何生成标准的JAVA API文档的相关资料,Javadoc是Sun公司提供的一种工具,它可以从程序源代码中抽取类、方法、成员等注释,然后形成一个和源代码配套的API帮助文档,需要的朋友可以参考下
    2024-06-06
  • java多线程之铁路售票系统

    java多线程之铁路售票系统

    这篇文章主要为大家详细介绍了java多线程之铁路售票系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Java判断字符串是否为IP地址的方法

    Java判断字符串是否为IP地址的方法

    这篇文章主要为大家详细介绍了Java判断字符串是否为IP地址的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • SpringBoot个性化启动Banner设置方法解析

    SpringBoot个性化启动Banner设置方法解析

    这篇文章主要介绍了SpringBoot个性化启动Banner设置方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • SpringBoot整合FastDFS中间件实现文件分布管理

    SpringBoot整合FastDFS中间件实现文件分布管理

    FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件上传、文件下载等,解决了大容量存储和负载均衡的问题,本文介绍了SpringBoot整合FastDFS中间件实现文件分布管理,需要的朋友可以参考下
    2024-08-08
  • Java程序中添加播放MIDI音乐功能的实现方法详解

    Java程序中添加播放MIDI音乐功能的实现方法详解

    本篇文章是对在Java程序中添加播放MIDI音乐功能的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • JavaWeb详细讲述Cookie和Session的概念

    JavaWeb详细讲述Cookie和Session的概念

    web开发阶段我们主要是浏览器和服务器之间来进行交互。浏览器和服务器之间的交互就像人和人之间进行交流一样,但是对于机器来说,在一次请求之间只是会携带着本次请求的数据的,但是可能多次请求之间是会有联系的,所以提供了会话机制
    2022-06-06
  • springboot使用yml文件配置多环境方式(dev、test、prod)

    springboot使用yml文件配置多环境方式(dev、test、prod)

    这篇文章主要介绍了springboot使用yml文件配置多环境方式(dev、test、prod),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • springmvc模式的上传和下载实现解析

    springmvc模式的上传和下载实现解析

    这篇文章主要介绍了springmvc模式下的上传和下载实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • SpringBoot源码之Bean的生命周期

    SpringBoot源码之Bean的生命周期

    spring的bean的生命周期主要是创建bean的过程,一个bean的生命周期主要是4个步骤,实例化,属性注入,初始化,销毁,本文详细介绍了bean的生命周期,感兴趣的小伙伴可以参考阅读
    2023-04-04

最新评论