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

安稳与你 提交于 2020-01-30 09:31:13

问题


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:

App.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 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

package se.springtest;

public interface Person {
public void show();
}

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

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

<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...


回答1:


Try to add

<context:annotation-config/>  

to your Spring config file.




回答2:


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 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.



来源:https://stackoverflow.com/questions/7182908/my-spring-bean-is-not-injected-or-created-when-i-use-the-autowire-and-component

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!