java - 如何在没有任何 XML 和 spring 特定注释的情况下使用 JSR 330 和 Spring 作为实现?

标签 java spring dependency-injection spring-annotations jsr330

我想使用 JSR330(@Inject @Named、@Singleton,...)。由于 spring 被广泛使用,我想使用 spring 作为底层实现。但我不知道是否可以使用:

  1. 使用 JSR330
  2. 使用 Spring 作为实现
  3. 没有 spring 特定的注释仅允许 JSR330 注释。这不就是规范的全部内容吗?
  4. 没有 XML

我尝试了以下方法但没有成功:

package org.di.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.tomerbd.snippets.nlp.OpenNLP;

import javax.inject.Inject;

// A failed attempt to achieve: DI + JSR330 + Spring + NoSpring Specific Annotations + No XML
// I didn't want to have any spring annotations but it looks like I have to, wanted to be pure JSR330.
@Configuration
@ComponentScan
public class DIJSR330NoXML {

    public static class UseMe {
        public String getMe() { return "here I am"; }
    }

    public static class IWillUseYou {
        @Inject private UseMe useMe;

        public String letsUseHim() {
            return useMe.getMe();
        }
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext ctx = new AnnotationConfigApplicationContext("org.di.spring");
        ((AnnotationConfigApplicationContext) ctx).refresh();
        IWillUseYou user = ctx.getBean(IWillUseYou.class); // any other way to get class? I don't want to use spring annotations only jsr330 please with spring as impl!
        System.out.println(user.letsUseHim());

    }
}

输出失败:

20:25:38.509 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Eagerly caching bean 'DIJSR330NoXML' to allow for resolving potential circular references
20:25:38.564 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Finished creating instance of bean 'DIJSR330NoXML'
20:25:38.566 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory'
20:25:38.794 [main] DEBUG org.springframework.context.annotation.AnnotationConfigApplicationContext - Unable to locate LifecycleProcessor with name 'lifecycleProcessor': using default [org.springframework.context.support.DefaultLifecycleProcessor@51c693d]
20:25:38.805 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Returning cached instance of singleton bean 'lifecycleProcessor'
20:25:38.813 [main] DEBUG org.springframework.core.env.PropertySourcesPropertyResolver - Could not find key 'spring.liveBeansView.mbeanDomain' in any property source
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.di.spring.DIJSR330NoXML$IWillUseYou' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:347)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:334)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1107)
    at org.di.spring.DIJSR330NoXML.main(DIJSR330NoXML.java:31)

Process finished with exit code 1

那么,如果 JSR330 提供了 DI 并且 spring 支持 JSR330,是否可以将 Spring 与 JSR 330 注释一起使用,而不需要任何 spring XML?

如果这是不可能的,那么你能告诉我为了让它工作而需要使用的绝对最小的 Spring 注释集(请不要使用 xml)吗?

最佳答案

所有注释来自javax.inject包含这些命名注释的 JSR330 被理解为只是一个 API,即提供接口(interface)但没有任何实现的应用程序接口(interface)。

这意味着按原样使用这些注释不会触发任何效果,因为没有类、容器,也没有任何东西可以监视这些注释的使用位置。 Java SE 和 Java EE 都不提供任何 IoC(控制反转)容器。您必须包含这些的实现框架 - Spring 就是一个很好的例子。

看看前。 JBoss Weld 。此实现和其他实现的配置方式(注释、XML、任何不同的东西)是单独的。

关于java - 如何在没有任何 XML 和 spring 特定注释的情况下使用 JSR 330 和 Spring 作为实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51544449/

相关文章:

java - 处理字符串 : Java client & C++ server 的正确方法是什么

java - 不相关项目之间的共享依赖关系

java - spring+hibernate 和@Transactionl 注解,是如何工作的?

c# - 对依赖注入(inject)感到困惑

android - Hilt - CoroutineDispatcher 上缺少绑定(bind)

c# - Simple Injector 是否有任何技术原因无法支持 .NET 4.0 上的 Web API?

java - 创建可用作 HashMap 键的 Java 类

java - 函数调用之外的弹出窗口

java - 如何做一个自定义的 JoptionPane

java - Spring Boot 应用程序中未插入尾部斜线