在独立的 Java 应用程序中使用 Spring 3 自动连线

这是我的代码:

public class Main {

    public static void main(String[] args) {
        Main p = new Main();
        p.start(args);
    }

    @Autowired
    private MyBean myBean;
    private void start(String[] args) {
        ApplicationContext context = 
            new ClassPathXmlApplicationContext("META-INF/config.xml");
        System.out.println("my beans method: " + myBean.getStr());
    }
}

@Service 
public class MyBean {
    public String getStr() {
        return "string";
    }
}

<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 
    <context:annotation-config /> 
    <context:component-scan base-package="mypackage"/>
</beans>

为什么这不起作用?我得到.是否可以在独立应用程序中使用自动布线?NullPointerException


答案 1

弹簧在独立应用中工作。您正在使用错误的方式创建春豆。正确的做法是这样的:

@Component
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = 
            new ClassPathXmlApplicationContext("META-INF/config.xml");

        Main p = context.getBean(Main.class);
        p.start(args);
    }

    @Autowired
    private MyBean myBean;
    private void start(String[] args) {
        System.out.println("my beans method: " + myBean.getStr());
    }
}

@Service 
public class MyBean {
    public String getStr() {
        return "string";
    }
}

在第一种情况下(问题中的那个),您是自己创建对象,而不是从Spring上下文中获取它。因此,Spring没有机会获得依赖关系(这会导致)。AutowireNullPointerException

在第二种情况下(这个答案中的那个),你从Spring上下文中获得豆子,因此它是Spring管理的,Spring负责。autowiring


答案 2

Spring正在远离XML文件,并大量使用注释。下面的示例是一个简单的独立Spring应用程序,它使用注释而不是XML文件。

package com.zetcode.bean;

import org.springframework.stereotype.Component;

@Component
public class Message {

   private String message = "Hello there!";

   public void setMessage(String message){

      this.message  = message;
   }

   public String getMessage(){

      return message;
   }
}

这是一个简单的豆子。它装饰有注释,以便通过Spring容器自动检测。@Component

package com.zetcode.main;

import com.zetcode.bean.Message;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@ComponentScan(basePackages = "com.zetcode")
public class Application {

    public static void main(String[] args) {

        ApplicationContext context
                = new AnnotationConfigApplicationContext(Application.class);

        Application p = context.getBean(Application.class);
        p.start();
    }

    @Autowired
    private Message message;
    private void start() {
        System.out.println("Message: " + message.getMessage());
    }
}

这是主类。注释将搜索零部件。注释将 Bean 注入到变量中。用于创建 Spring 应用程序上下文。Application@ComponentScan@AutowiredmessageAnnotationConfigApplicationContext

我的独立弹簧教程展示了如何创建一个包含XML和注释的独立Spring应用程序。


推荐