如何在没有任何 XML 且没有 spring 特定注释的情况下使用带有 Spring 作为实现的 JSR 330?
How to use JSR 330 with Spring as implementation without any XML and without spring specific annotations?
我想使用 JSR330(@Inject @Named,@Singleton,...)。因此,由于 spring 是常用的,所以我想使用 spring 作为底层实现。但我不知道是否可以使用:
- 使用 JSR330
- 以Spring作为实现
- 没有 spring 特定注释 仅允许 JSR330 注释。这不是规范的全部内容吗。
- 没有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 和 Only JSR 330 注释并且没有任何 spring XML?
如果这是不可能的,那就不可能了,你能告诉我为了让它工作我需要使用的绝对最小的 spring 注释集是什么(请不要 xml) .
所有来自 javax.inject
的注释被理解为 JSR330
包括这些命名注释只是一个 API,即提供接口但没有任何实现的应用程序接口。
这意味着按原样使用这些注释不会触发任何效果,因为没有 class 容器,没有任何东西可以监视这些注释在哪里使用。 Java SE 和 Java EE 均未提供任何 IoC(控制反转)容器。您必须包括这些的实施框架 - Spring 是一个很好的例子。
看看前任。 JBoss Weld。这个和其他实现的配置方式(注释,XML,任何不同的东西)都是独立的。
我想使用 JSR330(@Inject @Named,@Singleton,...)。因此,由于 spring 是常用的,所以我想使用 spring 作为底层实现。但我不知道是否可以使用:
- 使用 JSR330
- 以Spring作为实现
- 没有 spring 特定注释 仅允许 JSR330 注释。这不是规范的全部内容吗。
- 没有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 和 Only JSR 330 注释并且没有任何 spring XML?
如果这是不可能的,那就不可能了,你能告诉我为了让它工作我需要使用的绝对最小的 spring 注释集是什么(请不要 xml) .
所有来自 javax.inject
的注释被理解为 JSR330
包括这些命名注释只是一个 API,即提供接口但没有任何实现的应用程序接口。
这意味着按原样使用这些注释不会触发任何效果,因为没有 class 容器,没有任何东西可以监视这些注释在哪里使用。 Java SE 和 Java EE 均未提供任何 IoC(控制反转)容器。您必须包括这些的实施框架 - Spring 是一个很好的例子。
看看前任。 JBoss Weld。这个和其他实现的配置方式(注释,XML,任何不同的东西)都是独立的。