焊接容器如何在java se环境中应用?

时间:2016-09-24 14:23:35

标签: java maven cdi weld weld-se

  

我是焊接的新手,经过几天的探索,但我只知道焊接的一些基本概念。

  

我打算在 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报告了以下错误

     

enter image description here

     

并且通过互联网搜索,有一种说法是建立一个空的 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等。但发现他们对我来说都是高级的。    感谢您的关注进展。

1 个答案:

答案 0 :(得分:2)

  
      
  1. 如何使用焊接成功运行我的应用程序?
  2.   

错误消息告诉您必须在目录beans.xml下创建名为META-INF的文件。所以要解决这个问题,请执行以下操作:

  1. META-INF目录
  2. 下名为src/main/resources的目录
  3. beans.xml下创建一个名为META-INF的空文件,以便您的项目启用CDI。
  4.   
        
    1. 我们应该使用注释@Produces
    2.   

    如果要使用任何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应显示在控制台上。