繁体   English   中英

使用CDI在简单的Java程序中进行依赖注入

[英]Dependency Injection in simple java program using CDI

在仅使用CDI的简单java程序中,是否总是需要bean.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,mi正确了吗?

您可以使用autowiring,以便向不属于应用程序上下文一部分的对象注入依赖关系(并可能将后处理程序应用于)。

您可以将java config类与工厂方法一起使用来配置ApplicationContext

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@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("#?*")

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

是的,这些豆被注入其他豆中

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

您需要做的就是构造bean容器,它将加载bean,解决依赖关系并启动程序(如果使用的是init-method)。 通常,我的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方法启动了我的应用程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM