我是焊接的新手,经过几天的探索,但我只知道焊接的一些基本概念。
我打算在 java se 环境中使用焊接容器。以下What is the easiest way to have CDI and JPA in Java SE?我的代码段如下:
public class SayHello {
public SayHello(){}
public void sayHello(){
System.out.println("Hello");
}
}
import javax.inject.Inject;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
public class UseInject {
private SayHello obj;
public UseInject(){}
@Inject
public UseInject(SayHello obj){
this.obj = obj;
}
public void show(){
obj.sayHello();
}
public static void main(String[] args){
Weld weld = new Weld();
WeldContainer container = weld.initialize();
UseInject ui = container.instance().select(UseInject.class).get();
ui.show();
weld.shutdown();
}
}
我的应用程序基于 maven 。这是 pom.xml
中的jar依赖关系段
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>3.0.0.Alpha17</version>
我的意图是将SayHello对象注入UseInject对象,因此该应用程序的最终输出为&#34; Hello&#34;。 但事情并不是那么顺利,jvm报告了以下错误:
并且通过互联网搜索,有一种说法是建立一个空的 beans.xml 是好的,我跟着它无法生效。至于主要方法我模仿 What is the easiest way to have CDI and JPA in Java SE?我不知道它做了什么,What is the easiest way to have CDI and JPA in Java SE?使用 @Produces 注释,我不知道是否也应该使用它。我原本打算将它用于SayHello Class,但我不知道我应该导入哪个jar才能使用它,所以我放弃了。
现在我想: 的 1。知道焊接服务的应用方式,换句话说,主要方法的用途是什么?
2。如何使用焊接成功运行我的应用程序?
3。什么时候我们应该使用注释@Produces
我提到了一些相关问题,例如weld and java se How to bootstrap weld-se in a JUnit test等。但发现他们对我来说都是高级的。 感谢您的关注进展。
答案 0 :(得分:2)
- 如何使用焊接成功运行我的应用程序?
醇>
错误消息告诉您必须在目录beans.xml
下创建名为META-INF
的文件。所以要解决这个问题,请执行以下操作:
META-INF
目录src/main/resources
的目录
beans.xml
下创建一个名为META-INF
的空文件,以便您的项目启用CDI。
- 我们应该使用注释@Produces
醇>
如果要使用任何Java基元类型(如Integer,String,...)作为CDI bean,或者外部库中不包含的任何类型/类,则使用此批注类路径中的META-INF/beans.xml
文件。
示例:强>
public class SayHello {
@Produces
private double pi = 3.14159;
// the rest of the code
}
您可以将PI
的值注入代码中的其他位置:
public class UseInject {
@Inject
private double pi; // 3.14159 will be injected here
// the rest of the code
public static void main(...) {
// ....
UseInject ui = container.instance().select(UseInject.class).get();
ui.show();
System.out.println(ui.pi);
// ...
}
值3.14159应显示在控制台上。