java 当我使用自动装配和组件注释时,我的 spring bean 没有被注入或创建

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/7182908/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 18:58:58  来源:igfitidea点击:

My spring bean is not injected or created when I use the autowire and component annotations

javaspringdependency-injectionannotationsnullpointerexception

提问by Clumsy

I'm trying to understand DI, but my spring bean is not injected or created when I use the autowire and component annotations. Instead I get a nullpointer exception because my bean is null. Should I created it manually and in that case where? Where do you specify the order in which the beans are created, when several beans depend on each other? Here is my code:

我正在尝试了解 DI,但是当我使用自动装配和组件注释时,我的 spring bean 没有被注入或创建。相反,我得到了一个空指针异常,因为我的 bean 为空。我应该手动创建它,在这种情况下在哪里创建?当多个 bean 相互依赖时,您在哪里指定创建 bean 的顺序?这是我的代码:

App.java

应用程序.java

package se.springtest;

import se.springtest.Person;

import org.springframework.core.io.ClassPathResource;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;

public class App 
{
  public static void main( String[] args )
  {
    BeanFactory factory = new XmlBeanFactory(
            new ClassPathResource("application-context.xml"));

        Person p = (Person) factory.getBean("person");
        p.show();

  }
}

application-context.xml

应用程序上下文.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:jdbc="http://www.springframework.org/schema/jdbc"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="se.springtest"/>

</beans>

Person.java

人.java

package se.springtest;

public interface Person {
public void show();
}

PersonImpl.java

PersonImpl.java

package se.springtest;
import org.springframework.stereotype.Component;
import org.springframework.beans.factory.annotation.Autowired;

@Component("person")
public class PersonImpl implements Person {
private String firstName;
private String lastName;
private AdressInfo adress;

public PersonImpl() {firstName="Olle"; lastName="Olsson";       System.out.println("creating PersonImpl object");}


@Autowired
public void setAdress(AdressInfo adress) {
    this.adress = adress;
}

public AdressInfo getAdress() {
    return adress;
}

public String getFirstName() {
    return firstName;
}

public void setFirstName(String firstName) {
    this.firstName = firstName;
}

public String getLastName() {
    return lastName;
}

public void setLastName(String lastName) {
    this.lastName = lastName;
}

public void show() {
    System.out.println("Name is " + getFirstName() + " " +getLastName());
    if (adress!=null)
        adress.show();
    else System.out.println("null");
}
}

AdressInfo.java

地址信息.java

package se.springtest;

public interface AdressInfo {
public void show();
}

AdressInfoImpl.java

地址信息实现程序

package se.springtest;

import org.springframework.stereotype.Service;

@Service("adress")
public class AdressInfoImpl implements AdressInfo {
private String adress;

public AdressInfoImpl() {adress="Storgatan 1"; System.out.println("creating AdressImpl object");}

public String getAdress() {
    return adress;
}

public void setAdress(String adr) {
    this.adress = adr;
}

public void show() {
    System.out.println("Address is " + adress);  
}
}

pom.xml

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>se.springtest</groupId>
<artifactId>spring-hello</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>spring-hello</name>
<url>http://maven.apache.org</url>

<build>
 <plugins>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <executions>
      <execution>
        <goals>
          <goal>java</goal>
        </goals>
      </execution>
    </executions>

    <configuration>
      <mainClass>se.springtest.App</mainClass>

    </configuration>


  </plugin>
  <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.5</source>
      <target>1.5</target>
    </configuration>
  </plugin>

</plugins>
</build>  

<dependencies>
 <dependency>
  <groupId>junit</groupId>
  <artifactId>junit</artifactId>
  <version>3.8.1</version>
  <scope>test</scope>
 </dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring</artifactId>
  <version>2.5.6.SEC02</version>
</dependency>
</dependencies>
</project>

And I compile it with

我编译它

mvn clean compile exec:java

but I get

但我明白了

Name is Olle Olsson
null

instead of

代替

Name is Olle Olsson
Adress is Storgatan 1

It would be really helpful if someone could tell me what is the problem. It would make me and maybe others understanding DI better...

如果有人能告诉我问题出在哪里,那将非常有帮助。这会让我和其他人更好地理解 DI...

回答by dbf

Try to add

尝试添加

<context:annotation-config/>  

to your Spring config file.

到您的 Spring 配置文件。

回答by Ryan Stewart

You're only creating a BeanFactory, which has extremely limited functionality. It really does nothing more than instantiate beans and let you manually wire them together. The functionality you're looking for only exists in ApplicationContexts, which is really Spring's bread and butter. Change

您只是在创建一个功能极其有限的 BeanFactory。它实际上只是实例化 bean 并让您手动将它们连接在一起。您正在寻找的功能仅存在于 ApplicationContexts 中,它确实是 Spring 的基本要素。改变

BeanFactory factory = new XmlBeanFactory(
        new ClassPathResource("application-context.xml"));

to

BeanFactory factory = new ClassPathXmlApplicationContext(
        "application-context.xml");

Then read "The BeanFactory"to get familiar with the distinction.

然后阅读“The BeanFactory”以熟悉区别。