当我使用自动装配和组件注释时,我的 spring bean 没有被注入或创建 [英] My spring bean is not injected or created when I use the autowire and component annotations

查看:28
本文介绍了当我使用自动装配和组件注释时,我的 spring bean 没有被注入或创建的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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();

  }
}

应用程序上下文.xml

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

Person.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");
}
}

地址信息.java

package se.springtest;

public interface AdressInfo {
public void show();
}

AdressInfoImpl.java

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>

我用

mvn clean compile exec:java

但我明白了

Name is Olle Olsson
null

代替

Name is Olle Olsson
Adress is Storgatan 1

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

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

推荐答案

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

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"));

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

然后阅读The BeanFactory" 以熟悉区别.

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

这篇关于当我使用自动装配和组件注释时,我的 spring bean 没有被注入或创建的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆