★spring@Autowired注解原理,通俗易懂(笔记)

先讲 一个@Autowired注解的例子

先给出src的包:很基础的 三层dao、service、servlet
在这里插入图片描述
BookDao.java:就一个saveBook()方法

package com.atshiyou.dao;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;

@Repository

public class BookDao {
	
	public void saveBook() {
		System.out.println("保存了一本图书");
	}
}

BookService.java :里面就一个save()方法

package com.atshiyou.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.atshiyou.dao.BookDao;

@Service
public class BookService {
	
	@Autowired
	private BookDao bookDao;
	
	public void save() {
		System.out.println("<bookService>..正在调用dao帮你保存图书");
		bookDao.saveBook();
	}
}

BookServlet.java,doGet方法里调用save方法

package com.atshiyou.servlet;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import com.atshiyou.service.BookService;

@Controller
public class BookServlet {
	
	//自动装配,自动地为这个属性赋值
	@Autowired
	private BookService bookService;
	
	public void doGet() {
		bookService.save();
	}
}

Test文件中:调用doGet方法查看输出

package com.atshiyou.test;

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.atshiyou.service.BookService;
import com.atshiyou.servlet.BookServlet;

class IocTest {

	ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
	
	@Test
	public void test2() {
		BookServlet bean = ioc.getBean(BookServlet.class);
		bean.doGet();		
	}
}

结果:
在这里插入图片描述

再讲@Autowired原理

@Autowired原理:
		举例:@Autowired
			 private BookService bookService;
		1)、先按照类型去容器中找到对应的组件;bookService = ioc.getBean(BookService.class)
			①、找到一个:找到就赋值
			②、没找到就报异常
			③、按照类型可以找到多个?找到多个如何装配上?
			    a、类型一样就按照变量名为ID继续匹配
			      Ⅰ、匹配上就装配
			      Ⅱ、没有匹配?报错
			      		原因:因为我们按照变量名作为id继续匹配的
			      		使用@Qualifier指定一个新的id
			      			找到就匹配

对于a、这种情况,按照变量名作为id继续匹配,还是匹配不到的话,可以使用新的注解:
@Qualifier:指定一个新id作为id,让spring不使用变量名作为id

如果@Qualifier也找不到就会报错

总结┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳┳

用例子总结:
@Autowired
private BookService bookService;
总结:autowired 为组件自动赋值,自动查找ioc容器,找到就赋值,查找的方式是从类型寻找,有可能找到多个,比如说有一个继承于要查找的类,如果是多个就按照变量名作为id继续匹配
举例说:查找到多个相同的类是BookService 和 BookServiceExtend,这 个 时候会根据你要查找的bookservice 来查找id,BookService 的id默认是bookservice,BookServiceExtend的id默认是bookServiceExtend,一查找就只匹配上BookService 类了

如果现在把例子该了:改成bookService2了
@Autowired
private BookService bookService2;
Spring容器先查找BookService类,一找就找到两个类(BookService 和BookServiceExtend),然后查找id,发现都不匹配,会直接报错
这个时候诞生了@Qualifier注解,让spring不使用bookService2作为id去查找,而是使用一个比如说bookService去查找,作为新的id去查找
@Qualifier("bookService")
@Autowired
private BookService bookService2;
@Qualifier注解找不到就报错,找到就装配

所以发现Autowired标注的自动装配的属性默认是一定装配上的,找到就装配,找不到就拉倒
可以在Autowired(request = false)默认是true,找不到就会报错,置为false后,找不到会置为null
@Qualifier("bookService")
@Autowired(request=false)
private BookService bookService2;

方法上有@Autowired的话,对于参数的类型是引入进来的,import进来的:
1)、这个方法也会在bean创建的时候自动运行
2)、这个方法上的每一个参数都会自动注入值
eg:
xml文件:

@Autowired
	public void haha(BookDao bookDao,BookService bookService){
		System.out.println("Spring运行了这个方法...."+ bookDao+"==>"+bookService);
	}

Test文件:只是创建了容器,没有去取容器里的东西


	ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
	
	@Test
	public void test2() {
	}

运行结果:输出了在haha函数的输出语句
在这里插入图片描述

  • 24
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

你在狗叫什么、

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值