1.0 spring的配置文件 spring-context.xml
<?xml version="1.0" encoding="UTF-8"?><!--启用注解-->
<context:component-scan base-package="com.test" />
<!--<aop:aspectj-autoproxy/>-->
<!-- 属性文件读入 -->
<bean id="nameInfo" class="java.util.LinkedHashMap" name="nameInfo">
<constructor-arg>
<map key-type="java.lang.String" value-type="java.lang.String">
<entry key="firstName" value="x"></entry>
<entry key="lastName" value="yd"></entry>
</map>
</constructor-arg>
</bean>
<bean id="nameInfo1" class="java.util.LinkedHashMap" name="nameInfo1">
<constructor-arg>
<map key-type="java.lang.String" value-type="java.lang.String">
<entry key="first" value="1"></entry>
<entry key="last" value="2"></entry>
</map>
</constructor-arg>
</bean>
2. Bean1.java package com.test;
import org.springframework.stereotype.Component;
import java.util.LinkedHashMap;
@Component(“name1”)
public class Bean1 {
private LinkedHashMap<String,String> nameInfo;
public LinkedHashMap<String, String> getNameInfo() {
return nameInfo;
}
public void setNameInfo(LinkedHashMap<String, String> nameInfo) {
this.nameInfo = nameInfo;
}
public String say(){
return "Bean1";
}
}
2. Bean2.java
package com.test;
import org.springframework.stereotype.Component;
@Component(“bean2”)
public class Bean2 extends Bean1{
@Override
public String say(){
return "I'm bean2 ok";
}
}
- Bean3.java
package com.test;
import org.springframework.stereotype.Component;
@Component(“bean3”)
public class Bean3 extends Bean1 {
@Override
public String say(){
return “I’m Bean3 OK”;
};
}
- 启动 moudle2.java
package com.test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.LinkedHashMap;
@Component(“md2”)
public class Moudle2 {
@Resource
private LinkedHashMap<String,String > nameInfo;
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-context.xml");
Moudle2 m2 = (Moudle2)applicationContext.getBean("md2");
System.out.println( m2.getMap());
}
public String getMap(){
return nameInfo.get("firstName");
}
public void gerMoudle2(){
System.out.println("恭喜你获得了moudle2");
}
}
- test
package com.test;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/spring-context.xml")
public class Moudle2Test {
// @Resource
// private HashMap<String,String> nameInfo1;
// @Resource
// private Bean1 bean123;
@Resource(name = "name1")
private Bean1 bean2;
@Test
public void getMap() {
// System.out.println(nameInfo1.get(“firstName”));
// System.out.println(bean123.getNameInfo().get(“firstName”));
System.out.println(bean2.getNameInfo().get(“lastName”));
System.out.println(bean2.say());
}
}
一. bean中的id的作用
@Autowire 先按类型匹配 在按名字匹配
假设在配置文件中的
假设在一个类中有这样的一个注入
@Autowire
private BeanA bean;
如果只有一个BeanA 那么自动按类型注入就会成功
如果像上面那样 有两个BeanA 那么就会先按类型 然后按变量名匹配bean 的 ID,
就像上面
@Autowire
private BeanA bean; 系统就会报错
如果是
@Autowire
private BeanA bean1; 就会匹配
如果是
private BeanA bean2; 就会匹配
二. bean中 name的作用
还是上面的例子
如果我们这样注入
@Resource
private BeanA bean;
@Resource 首先是根据变量名bean匹配name 查bean工厂查到没有name为bean的 bean
并且还有两个类型为BeanA的bean spring不知道该注入那个bean所以会报错
如果这么写
@Resource(name = “name1”)
private BeanA bean;
这时候spring就能根据name找到这个bean
就会注入