Spring源码从入门到精通---@Autowired&@Qualtify(十一)

上篇文章主要讲了@Value的赋值:普通赋值,@Value("#{}"),spEl表达式赋值,@Value("&{}")读取配置文件赋值:

Spring源码从入门到精通---@Value赋值(十)

这篇文章主要介绍spring的自动装配,DI依赖注入,各个组件赋值,完成在IOC容器的组件调用。常用的@Autowird按类型去ioc容器中找组件注解,与之对应的有个@Resource按名称注解以后在讲解。

1、@Autowired

1)、默认优先[按照类型]去ioc容器中找组件 AnnotationConfigApplicationContext.getBean(BookDao.class);

2)、若此类型在容器中找到两个以上组件,则加载此方法找默认的名称AnnotationConfigApplicationContext.getBean("bookDao");

3)、可以和@Qualifier("组件名")组合使用,直接指定组件名。

4)、加载的@Autowired(required=false)必须在容器中存在此组件,IOC容器不存在则报错,默认为true,也可以指定为false,则不会报错。

5)、@Primary注解也可以指定主加载的组件,这时候就默认加载此主键的组件,除非@Qualifier指定其他组件。


/**
 * @Autowired
 * Spring 的自动装配:DI依赖注入,各个组件之间的装配赋值,完成对IOC容器里各个对象之间赋值调用。
 * 1)、默认优先按照类型去ioc容器中找组件
 *
 * @author keying
 * @Autowired
 */
@Configuration
@ComponentScan(value = {"com.alibaba.controller","com.alibaba.service","com.alibaba.dao"})
public class ConfigOfAutowired {
    

}

@Controller
public class BookController {

    @Autowired
    private BookService bookService;

    public void print() {
        System.out.println(bookService);
    }
}


/**
 * @author keying
 * 加载进的ioc容器里的名字:默认首字母小写
 */
@Repository
public class BookDao {


}


@Service
public class BookService {

    @Autowired
    private BookDao bookDao;

    public void print() {
        System.out.println("BookService注入的bookDao:" + bookDao);
    }

    @Override
    public String toString() {
        return "BookService{" +
            "bookDao=" + bookDao +
            '}';
    }
}

public class IOCTestAutowired {

    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(
        ConfigOfAutowired.class);

    @Test
    public void test1() {
        //getBeanNames(applicationContext);

        BookService bookService = applicationContext.getBean(BookService.class);
        BookDao bookDao = applicationContext.getBean(BookDao.class);
        System.out.println("bookService:" + bookService);
        System.out.println("bookDao:" + bookDao);
        applicationContext.close();
    }

从junitTest打印的地址值可以看到,不管在bookService类取出的bookDao对象还是直接取的bookDao对象,指向java堆内存是同一个地址值。

2、@Qualifier

 问:如果一个对象在ioc里创建两个组件,一个叫bookDao1,一个叫bookDao2,默认先加载哪个呢,如果指定加载哪个就可以用到@Qualifier("bookDao2")。代码如下:

@Service
public class BookService {

    @Autowired
    @Qualifier("bookDao2")
    private BookDao bookDao;

    public void print() {
        System.out.println("BookService注入的bookDao:" + bookDao);
    }

    @Override
    public String toString() {
        return "BookService{" +
            "bookDao=" + bookDao +
            '}';
    }
}

/**
 * @author keying
 * 加载进的ioc容器里的名字:默认首字母小写
 */
@Repository
public class BookDao {

    private String lable = "1";

    public String getLable() {
        return lable;
    }

    public void setLable(String lable) {
        this.lable = lable;
    }

    @Override
    public String toString() {
        return "BookDao{" +
            "lable='" + lable + '\'' +
            '}';
    }
}
 @Test
    public void test1() {
        //getBeanNames(applicationContext);

        BookService bookService = applicationContext.getBean(BookService.class);
        //BookDao bookDao = applicationContext.getBean(BookDao.class);
        System.out.println("bookService:" + bookService);
        //System.out.println("bookDao:" + bookDao);


        applicationContext.close();
    }

在Config配置文件里用@Bean注解新注册一个bookDao2组件,给BookDao类加一个lable字段,

1)、若加载的默认bookDao对象,则会打印lable为1

2)、若加载的bookDao对象,Autowird按类型加载,则需要用@Qualifier注解在BookService类指定加载的名称。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

后端从入门到精通

你的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值