使用CDI的简单java程序中的依赖注入

时间:2013-10-16 12:38:16

标签: java spring dependency-injection

在仅使用CDI的简单java程序中,我们总是需要一个beans.xml来进行依赖注入吗?我们是否需要构造一个bean来获取注入的对象???

以下是具有依赖注入::

的简单java项目的代码

接口

 public interface Hello
 {
      public void sayHello(String str);
 }

 public class HelloImpl1 implements Hello{
               public void sayHello(String str){
 System.out.println("Hello from 1st block")
               }
 }

          public class HelloImpl2 implements hello{
                public void sayHello(String str){
                    System.out.println("Hello from 2nd block")
                            }
                   }

      public CallingHello(){
          @Inject
          Hello hello;

         public void callHello(){
            hello.sayHello("Hey");
            }
       }

      public Test(){

    public static void main(String[] args){
       CallingHello hello=new CallingHello();
       hello.callHello();
         }

这就是我正在做的事情,并且在运行测试类时抛出nullpointerexception,而我在eclipse中制作简单的类没有bean,我是否正确?

3 个答案:

答案 0 :(得分:2)

您可以使用自动装配,以便将依赖关系(并可能应用后处理器)注入不属于应用程序上下文的对象。

您可以使用带工厂方法的java配置类来配置ApplicationContext

@Configuration
public class AppConfig {

    @Bean(name="HelloImpl1")
    public HelloImpl1 helloImpl1() {
        return new HelloImpl1();
    }

    @Bean(name="HelloImpl2")
    public HelloImpl1 helloImpl2() {
        return new HelloImpl2();
    }
}

然后实例化:

ApplicationContext ctx = 
    new AnnotationConfigApplicationContext(AppConfig.class);
HelloImpl1 helloImpl1= (HelloImpl1)ctx.getBean("HelloImpl1");
helloImpl1.sayHello("#?*")

答案 1 :(得分:1)

如果使用Spring进行依赖注入,则始终需要配置文件。但它不需要命名为beans.xml。

是的,bean被注入其他beans

答案 2 :(得分:1)

技术上没有你没有使用XML文件定义你的bean并注入依赖项。它取决于您使用的ApplicationContext的类型。但是,对于大多数实际应用程序,您将使用一个AbstractXMLContextApplication实例,它将加载XML文件以找出您的应用已声明的bean。该文件的名称不必是beans.xml。这是一个使用的约定,但你不必将它命名为。在构造AbstractXMLApplicationContext对象的实现时,可以覆盖它查找的文件。

您需要做的就是构造bean容器,它将加载bean,解析依赖关系,并启动程序(如果您使用的是init方法)。通常,我的Spring Container Java程序如下所示:

ApplicationContext context = null;
try {
    context = new FileSystemXmlApplicationContext( new String[] { file } );
    // pause until we want to shutdown or after something happens.
    System.in.readLine();
} finally {
    context.close(); // remember to clean up!
}

我让bean启动我的应用程序的init方法。