Spring 5.x 和 CDI 2.x 集成选项

Spring 5.x and CDI 2.x Integration Options

考虑到 Spring 的 5.x 基线和 CDI 的基线 2.x,我应该考虑哪些更可行的选项将它们集成到 JSF 2.3 项目中,因为 JSF 2.3 是耦合的与 CDI?桥梁?自定义 Bean 工厂?其他人?

我们使用 bean 生产者访问 CDI 中的 Spring 个对象。由于在我们使用的体系结构中,UI 和 server/business 之间有一个接口层,这种集成得到了促进。 整合如下。

来自 view/ui 层的 Cdi 工厂。

public class MainViewClientFactory {

    public MainViewClientFactory() {
    }

    @ApplicationScoped
    @Produces
    public CadastroPaisService cadastroPaisService() {
        return CdiSpringUtils.getSpringBean(CadastroPaisService.class);
    }

}

CdiSpringUtils Class.

public class CdiSpringUtils {

    private CdiSpringUtils() {
    }

    public static <R, Q extends Annotation> R getSpringBean(Class<R> beanClass) {
        return ApplicationContextProvider.getApplicationContext().getBean(beanClass);
    }

    public static <R, Q extends Annotation> R getSpringBean(Class<R> beanClass, Class<Q> qualifierClass) {
        return ApplicationContextProvider.getQualifiedBeanOfType(beanClass, qualifierClass);
    }

}

ApplicationContextProvider Class。

public class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext context;

    public static ApplicationContext getApplicationContext() {
        return context;
    }

    public static <R, Q extends Annotation> R getQualifiedBeanOfType(Class<R> cls, Class<Q> qualifierAnnotationClass) {
        R bean = null;
        Map<String, R> beanMap = getApplicationContext().getBeansOfType(cls);
        for (Map.Entry<String, R> entry : beanMap.entrySet()) {
            Q targetAnnotation = getApplicationContext().findAnnotationOnBean(entry.getKey(), qualifierAnnotationClass);
            if (targetAnnotation != null) {
                bean = entry.getValue();
                break;
            }
        }
        return bean;
    }

    @Override
    public void setApplicationContext(ApplicationContext ctx) {
        context = ctx;
    }
}