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
My spring bean is not injected or created when I use the autowire and component annotations
提问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”以熟悉区别。