2

我们是否总是需要一个 beans.xml 来在仅使用 CDI 的简单 java 程序中进行依赖注入,我们是否需要构造一个 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();
         }

这就是我所做的一切,在运行测试类时它会抛出空指针异常,我正在制作简单的类,在 Eclipse 中没有 bean,我走对了吗?

4

3 回答 3

2

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

您可以使用带有工厂方法的 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("#?*")
于 2013-10-16T12:54:14.630 回答
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 方法启动我的应用程序。

于 2013-10-16T12:50:33.417 回答
1

如果你使用 Spring 进行依赖注入,你总是需要一个配置文件。但它不需要命名为 beans.xml。

是的,这些 bean 被注入到其他bean中。

于 2013-10-16T12:49:00.220 回答