当我使用自动装配和组件注释时,我的 spring bean 没有被注入或创建 [英] My spring bean is not injected or created when I use the autowire and component annotations
问题描述
我正在尝试了解 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屋!