java ee中javamail注解_JavaEE开发之Spring中的条件注解

原标题:JavaEE开发之Spring中的条件注解

一、条件注解----@Conditional

顾名思义,条件注解就是可以根据不同的条件来做出不同的事情。在Spring中条件注解可以说是设计模式中状态模式的一种体现方式,同时也是面向对象编程中多态的应用部分。

在Spring框架中,当我们使用条件注解时,我们会为每种独立的条件创建一个类,根据这个类对应的条件的成立情况我们来选择不同的任务来执行。当然我们在声明任务时,一般使用接口来声明。因为我们会在Spring的配置类中指定具体条件下的具体类。接下来,我们将来看一下Spring框架中@Conditional注解的具体使用方式。

当然同一个Service接口所对应的条件集合中是互斥的,也就是说在特定情况下只有一个条件成立。

1cab87443043a3d4bfc0a42a538c537b.png

1、创建服务接口以及具体的服务类

首先我们来创建一个Service的接口,然后再基于遵循该接口的情况下来创建两个Service类。下方我们将会在配置类中指定不同条件下会对应不同的Service对象。首先我们先来创建Service的接口。下方这段代码就是我们创建的Service的接口,该接口比较简单,只有一个描述方法。在具体是Service类中我们将会给出deion()方法的具体实现,用此方法来区分不同类的实现。

package com.zeluli.conditional;

public interface ConditinalServiceInteface {

public String deion();

}

创建完ServiceInterface后,我们就该创建具体的类了。下方的FirstConditionService和SecondConditionService两个类都实现了ConditinalServiceInteface接口,并且给出了deion()方法的具体实现。稍后,我们将会在下方类配置Bean时,给出相应的条件。

package com.zeluli.conditional;

public class FirstConditionService implements ConditinalServiceInteface {

public String deion() {

return "第一个条件成立的Service";

}

}

=========================================

package com.zeluli.conditional;

public class SecondConditionService implements ConditinalServiceInteface {

public String deion() {

return "第二个条件成立的Service";

}

}

2、创建@Conditional对应的条件类

创建完Service接口以及Service类后,接下来我们就来创建@Conditional注解所需的条件类。每个条件类对应着一种独立的情况,在Spring中的条件类需要实现Condition接口。下方是我们创建的两个条件类。

这两个条件类都实现了Spring框架中的Condition,并且给出了matches()方法的实现。matches()方法的返回值是一个布尔类型的值,如果返回false说明该条件类所对应的条件不成立,如果返回true则说明该条件对应的条件成立。为了简化操作,我们就指定FirstConditional对应的条件为false,而SecondConditional对应的条件为true。具体的条件类的实现如下所示。

package com.zeluli.conditional;

import org.springframework.context.annotation.Condition;

import org.springframework.context.annotation.ConditionContext;

import org.springframework.core.type.AnnotatedTypeMetadata;

public class FirstConditional implements Condition {

//提供条件的方法

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

return false;

}

}

==========================================

package com.zeluli.conditional;

import org.springframework.context.annotation.Condition;

import org.springframework.context.annotation.ConditionContext;

import org.springframework.core.type.AnnotatedTypeMetadata;

public class SecondConditional implements Condition {

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

return true;

}

}

3.在Java配置类中进行条件配置

Service的接口、Service的类以及相应的条件创建完毕后,接下来我们就该在Java的配置类中将条件类与Service类对象进行关联了。下方代码段就是该部分对应的配置类。在声明FirstConditionService类的Bean时,我们使用@Conditional注解,@Conditional的参数为FirstConditional.class,也就是说明当FirstConditional类所对应的条件成立时FirstConditionService的对象才会被实例化。

同理,下方的SecondConditionService对应的条件是SecondConditional。具体代码如下所示。

package com.zeluli.conditional;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Conditional;

import org.springframework.context.annotation.Configuration;

@Configuration

@ComponentScan("com.zeluli.conditional")

public class ConditionalConfig {

@Bean

@Conditional(FirstConditional.class) //指定条件类

public FirstConditionService getFirstConditionalService() {

return new FirstConditionService();

}

@Bean

@Conditional(SecondConditional.class)

public SecondConditionService getSecondConditionService() {

return new SecondConditionService();

}

}

4、创建Main方法进行测试

接下来又到了测试的时刻了,下方我们从上面的ConditionalConfig配置类中获取上下文,然后从上下文中获取相应的Service对象。在获取对象时,我们使用的是ConditionalServiceInterface接口来获取和声明的Bean。也就是说service变量所承载的对象是实现ConditionalServiceInterface接口的所有类中的某个类的对象。当某个Service类所对应的条件成立时,该类的对象就会被创建。

上面我们也提到过,ConditionalServiceInterface接口下每个类对应的这些条件必须是互斥的,也就是这些条件在特定情况下只有一个是成立的。因为我们为第二个条件返回的是true, 所以该条件是成立的,那么SecondConditionalService类的对象就会被调用。所以我们调用service的deion()方法时,调用的是SecondConditionalService类中的相应的方法。

每天记录一点,每天进步一点。

更多技术交流或获取前端、JAVA资料请加微信(858568103)。返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值