春季基本问题:使用@Autowired



我有以下两个对象:User和DomainUser

User.java:

package com.domain;
import java.io.Serializable;
@SuppressWarnings("serial")
public class User implements Serializable {
    private long id = 0;
    private String userName;
    private String password;
    public User() {
    }
    public User(long id) {
        this.id = id;
    }
    public String toString() {
        StringBuffer sb = new StringBuffer(256);
        sb.append("[id : ").append(id).append(", ");
        sb.append("userName : ").append(userName).append(", ");
        sb.append("password : ").append(password).append("]");
        return sb.toString();
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

DomainUser.java

package com.domain;
import org.springframework.beans.factory.annotation.Autowired;

public class DomainUser {

    @Autowired
    private User user;
    private String domainName;
    public String toString() {
        StringBuffer sb = new StringBuffer(255);
        sb.append(user.toString()).append(", domainName : ").append(domainName);
        return sb.toString();
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public String getDomainName() {
        return domainName;
    }
    public void setDomainName(String domainName) {
        this.domainName = domainName;
    }

}

我正在尝试使用@Autowired annotation将中的User对象自动连接到DomainUser。但是,当我按照下面的方式运行测试时,User对象不会被填充。

applicationContext.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <bean id="user" class="com.domain.User">
        <constructor-arg  value="#{1234}"/> 
        <property name="userName" value="somename" />
        <property name="password" value="sompassword" />
    </bean>
    <bean id="domainUser" class="com.domain.DomainUser">
        <property name="domainName" value="mysite" />
    </bean>
</beans>

DomainUserTest.java

package com.domain.test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.domain.DomainUser;
public class DomainUserTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");
        DomainUser domainUser = (DomainUser) context.getBean("domainUser");
        System.out.println(domainUser.toString());
    }
}

如果我使用applicationContext.xml中的autowiring属性中的"byType"自动布线,它工作正常:

    <bean id="domainUser" class="com.domain.DomainUser" autowire="byType">
        <property name="domainName" value="mysite" />
    </bean>

有人能帮我理解为什么@Autowired注释不能产生同样的结果吗?

您需要AutowiredAnnotationBeanPostProcessor来处理@Autowired属性的注入。您可以放置<context:annotation-config />(您需要在xml中定义上下文-命名空间),或者只在xml:中将后处理器定义为bean

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>

有关详细信息,请参阅此处的示例。

最新更新