Spring自动装配行为

时间:2015-08-14 21:02:46

标签: java spring

我有下一个简单的应用程序(类消息只有一个打印传入消息的方法,对此问题没兴趣):

package messager.spring;

public class User {
    private Messenger misiger;
    private String name;

    public User(String name) {
        this.name = name;
    }

    public void setMessenger(Messenger messinger) {
        this.misiger = messinger;
    }

    public void send(String mess) {
        String message = name + " sent message " + "'" + mess + "'";
        misiger.send(message);
    }

//  public String getname() {
//      return name;
//  }
}

主要课程:

package messager.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
          ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

          User user = (User) context.getBean("user");

          user.send("testing3...");
       }
}

Spring配置文件:

<?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-2.5.xsd">

    <bean id="user" class="messager.spring.User" autowire="byName">
        <constructor-arg type="java.lang.String" value="Vova2"/>
   </bean>

   <bean id="messenger" class="messager.spring.MobileMessenger"/>
</beans>

我使用自动装配类用户自动装配Messanger类。根据文件:

当使用 ByName 时,它会尝试匹配并将其属性与配置文件中相同名称定义的bean相连。如果找到匹配项,它将注入那些bean,否则会抛出异常。

此配置有效,但我不明白为什么((我在用户类中没有名称 messenger 的属性(((我故意将其更改为 misiger 。它仍然有效。看来bean id不直接取决于属性名称,而是取决于setter名称!!!是这样吗?

2 个答案:

答案 0 :(得分:3)

是的,你是对的。如上所述here

  

Spring会将方法名称中“set”后的第一个字母小写,并按原样使用方法名称的其余部分来推断属性名称。

所以不是成员变量,而 setter 定义了属性名称。

答案 1 :(得分:1)

通过查看命名约定,了解JavaBeans的工作原理。

基础参考不一定相关。

您的媒体资源的名称messenger,因为有一个名为getter的getter。