美文网首页
Spring 条件装配之@Conditional

Spring 条件装配之@Conditional

作者: Tinyspot | 来源:发表于2023-12-11 10:21 被阅读0次

1. 装配Bean

@Configuration
public class BeanConditionConfig {

    @Conditional({BizBeanCondition.class})
    @Bean
    public EnvBean bizEnvBean(){
        return new EnvBean("biz");
    }

    @Conditional({SysBeanCondition.class})
    @Bean
    public EnvBean sysEnvBean(){
        return new EnvBean("sys");
    }
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class EnvBean {
    private String env;
}

1.1 实现 Condition 接口

  • 重写matches(), 返回值为 true 时,表示把 Bean 注册到 Spring IOC 容器
public class BizBeanCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        Environment environment = context.getEnvironment();
        return "Mac OS X".equals(environment.getProperty("os.name"));
    }
}
public class SysBeanCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        // 1. 操作系统信息
        String osName = context.getEnvironment().getProperty("os.name");
        // 2. 注册的bean
        BeanDefinitionRegistry registry = context.getRegistry();
        String[] beanDefinitionNames = registry.getBeanDefinitionNames();
        // 3. BeanFactory
        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
        // 4. ResourceLoader
        ResourceLoader resourceLoader = context.getResourceLoader();

        return EnvUtil.Env.DAILY.equals(EnvUtil.getEnv());
    }
}
public class EnvUtil {

    public static Env getEnv() {
        // Get env url
        return Env.DAILY;
    }

    public enum Env {
        DAILY,
        PRE,
        ONLINE
    }
}

2. 查看注册的Bean

请求URL http://localhost:8080/getBeanByName?name=bizEnvBean
打印结果 {"env":"biz"}

请求URL http://localhost:8080/getBeanByClass
打印结果 {"bizEnvBean":{"env":"biz"},"sysEnvBean":{"env":"sys"}}

@RestController
public class SpringBeansController {

    /**
     * 获取所有的bean
     */
    @RequestMapping("/getBeans")
    public String getBeans() {
        String[] beanDefinitionNames = SpringBeanUtils.getApplicationContext().getBeanDefinitionNames();
        List<String> beanNames = Arrays.stream(beanDefinitionNames)
                .filter(str -> !str.startsWith("org.") && !str.startsWith("spring."))
                .collect(Collectors.toList());
        return JSON.toJSONString(beanNames, SerializerFeature.PrettyFormat);
    }

    @RequestMapping("/getBeanByName")
    public String getBeanByName(String name) {
        EnvBean bean = (EnvBean) SpringBeanUtils.getBean(name);
        return JSON.toJSONString(bean);
    }
    @RequestMapping("/getBeanByClass")
    public String getBeanByClass() {
        // expected single matching bean but found 2: bizEnvBean,sysEnvBean
        // EnvBean bean = SpringBeanUtils.getBean(EnvBean.class);

        Map<String, EnvBean> beansOfType = SpringBeanUtils.getBeansOfType(EnvBean.class);
        return JSON.toJSONString(beansOfType);
    }
}

SpringBeanUtils 工具类

@Component
public class SpringBeanUtils implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringBeanUtils.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static <T> T getBean(Class<T> clazz) {
        return applicationContext.getBean(clazz);
    }

    public static Object getBean(String name) {
        return applicationContext.getBean(name);
    }

    public static <T> Map<String, T> getBeansOfType(Class<T> clazz) {
        return applicationContext.getBeansOfType(clazz);
    }

}

相关文章

网友评论

      本文标题:Spring 条件装配之@Conditional

      本文链接:https://www.haomeiwen.com/subject/cdcmgdtx.html