@Autowire与@Resource用法

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";
}

}

  1. 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”;
};
}

  1. 启动 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");
}

}

  1. 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
就会注入

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值