春季POJO注射类似于CDI

时间:2017-01-02 08:28:04

标签: spring dependency-injection

我有一些来自外部库的java对象,我需要在spring项目中注入。问题是库中的类不知道任何spring api的

如果我使用@Autowired将bean从库注入服务,我将获得org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type

以下是我的服务类

@Path("/test")
public class TestService {

    @Autowired
    SomeOtherClass service;

    @GET
    public Response get(){
        return Response.ok(service.someMethod()).build();
    }
}

以下是来自图书馆的我不知道春天的课程

public class SomeOtherClass {

    public String someMethod(){
        return "Data from library";
    }
}

当我调用我的服务时,我得到例外

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.example.SomeOtherClass' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

春天是否有办法注入一个类似于**CDI**注入的普通Java对象? 有一个选项可以定义applicationcontext.xml并在xml中定义SomeOtherClass并使用getBean,但我不想这样做。还有其他选择吗?

注意:

以下选项无法考虑,因为我有来自库

100's个类
  1. Cannot use applicationcontext.xml

  2. Cannot @Configuration @Bean to produce beans

3 个答案:

答案 0 :(得分:4)

您可以使用@Configuration和@Bean注释,如下所示 -

创建一个新类:

@Configuration
public class AppConfig {

    @Bean
    SomeOtherClass someOtherClassBean(){ return new SomeOtherClass();}

}

现在汽车接线应该工作。 它的作用,实际上是创建一个bean并让Spring了解它。

答案 1 :(得分:1)

也许尝试以编程方式将bean添加到IoC容器中: Add Bean Programmatically to Spring Web App Context

您需要找到要实例化的所有类,并使用链接问题中的一种方法。

答案 2 :(得分:1)

您可以使用反射以编程方式添加Bean定义。

git log --graph

随后,这些bean可能在其他地方 @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { Reflections ref = new Reflections(new ConfigurationBuilder() .setScanners(new SubTypesScanner(false /* don't exclude Object.class */), new ResourcesScanner()) .setUrls(ClasspathHelper.forPackage(PACKAGE_NAME)) .filterInputsBy(new FilterBuilder().include(FilterBuilder.prefix(PACKAGE_NAME)))); ref.getSubTypesOf(Object.class).stream() .forEach(clazz -> { logger.info("Defining pojo bean: {} -> {}", Introspector.decapitalize(clazz.getSimpleName()), clazz.getCanonicalName()); registry.registerBeanDefinition(Introspector.decapitalize(clazz.getSimpleName()), BeanDefinitionBuilder.genericBeanDefinition(clazz).getBeanDefinition()); }); } 。见Gist:https://gist.github.com/ftahmed/a7dcdbadb8bb7dba31ade463746afd04