V哥官网:http://www.vgxit.com
本博客对应视频教程:http://www.vgxit.com/course/23
条件化装配Bean
1,概述
有的时候我们在开发的时候需要按照条件来装配不同Bean。比如,我们开发一套人力资源管理系统。我们把这个系统分别提供给了公司A和公司B。但是公司A和公司B在导入用户数据的时候需求不同。公司A是导出了一个大的Json的文件给我们,让我们上传这个文件导入。而公司B是导出了一个Excel文件给我们,让我们导入这个文件。这个时候怎么办呢?
2,具体实现
思维导图:
1,定义一个员工数据操作的业务逻辑层,IEmployeeService接口
package com.vgxit.learn.spring.ktdm.condition.service;
public interface IEmployeeService {
void implodeEmployees();
}
2,定义两个接口的实现类,分别代表A公司的业务,和B公司的业务
package com.vgxit.learn.spring.ktdm.condition.service.impl;
import com.vgxit.learn.spring.ktdm.condition.service.IEmployeeService;
import org.springframework.stereotype.Component;
@Component
public class AEmployeeService implements IEmployeeService {
@Override
public void implodeEmployees() {
System.out.println("A公司导入员工");
}
}
package com.vgxit.learn.spring.ktdm.condition.service.impl;
import com.vgxit.learn.spring.ktdm.condition.service.IEmployeeService;
import org.springframework.stereotype.Component;
@Component
public class BEmployeeService implements IEmployeeService {
@Override
public void implodeEmployees() {
System.out.println("B公司导入员工");
}
}
3,写一个配置文件来定义当前运行的业务环境,application.properties:
business.env=ENVA
4,编写对应的配置类:
package com.vgxit.learn.spring.ktdm.condition.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.PropertySource;
@ComponentScan("com.vgxit.learn.spring.ktdm.condition")
@PropertySource("classpath:appliction.properties")
public class ConditionConfig {
}
5,定义对应的加载条件类:
package com.vgxit.learn.spring.ktdm.condition.conditionbean;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.stereotype.Component;
/**
* 定义加载条件类
*/
public class ACondition implements Condition {
/**
* 条件生成的方法,如果这个方法的结果为true就表示要注入对应的Bean
* @param conditionContext
* @param annotatedTypeMetadata
* @return
*/
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String envStr = conditionContext.getEnvironment().getProperty("business.env");
return "ENVA".equals(envStr);
}
}
package com.vgxit.learn.spring.ktdm.condition.conditionbean;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class BCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
String envStr = conditionContext.getEnvironment().getProperty("business.env");
return "ENVB".equals(envStr);
}
}
6,测试代码:
package com.vgxit.learn.spring.ktdm.condition.test;
import com.vgxit.learn.spring.ktdm.condition.config.ConditionConfig;
import com.vgxit.learn.spring.ktdm.condition.service.IEmployeeService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class ConditionTest001 {
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(ConditionConfig.class);
IEmployeeService employeeService = ctx.getBean(IEmployeeService.class);
employeeService.implodeEmployees();
}
}