8.1、场景模拟

8.1.1、UserDao接口及实现类

package org.rain.spring.dao;

/**
* @author liaojy
* @date 2023/8/5 - 18:32
*/
public interface UserDao { void saveUser(); }

package org.rain.spring.dao.impl;

import org.rain.spring.dao.UserDao;
import org.springframework.stereotype.Repository; /**
* @author liaojy
* @date 2023/8/5 - 18:33
*/
@Repository
public class UserDaoImpl implements UserDao {
public void saveUser() {
System.out.println("保存成功");
}
}

8.1.2、UserService接口及实现类

package org.rain.spring.service;

/**
* @author liaojy
* @date 2023/8/5 - 18:35
*/
public interface UserService { void saveUser(); }

package org.rain.spring.service.impl;

import org.rain.spring.dao.UserDao;
import org.rain.spring.service.UserService;
import org.springframework.stereotype.Service; /**
* @author liaojy
* @date 2023/8/5 - 18:36
*/
@Service
public class UserServiceImpl implements UserService { private UserDao userDao; public void saveUser() {
userDao.saveUser();
} }

8.1.3、UserController

package org.rain.spring.controller;

import org.rain.spring.service.UserService;
import org.springframework.stereotype.Controller; /**
* @author liaojy
* @date 2023/8/5 - 18:38
*/
@Controller("myUserController")
public class UserController { private UserService userService; public void saveUser(){
userService.saveUser();
} }

8.1.4、bean配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <!--
对指定的package进行扫描,将使用组件注解的类的对象,交给spring的ioc容器来管理
-->
<context:component-scan base-package="org.rain.spring"></context:component-scan> </beans>

8.1.5、测试

由控制台日志可知,组件注解+组件扫描,存在尚未实现依赖注入的问题

    @Test
public void testAutowireByAnnotation(){ ApplicationContext ioc = new ClassPathXmlApplicationContext("spring-ioc-annotation.xml");
UserController userController = ioc.getBean(UserController.class);
userController.saveUser(); }

8.2、@Autowired注解

@Autowired:实现自动装配功能的注解,其能够标识的位置有三处

8.2.1、方式一:标识在成员变量上(常用)

    @Autowired
private UserDao userDao;

    @Autowired
private UserService userService;

8.2.2、方式二:标识在setter方法上

    private UserDao userDao;

    @Autowired
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}

    private UserService userService;

    @Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}

8.2.3、方式三:标识在有参构造方法上

    private UserDao userDao;

    @Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}

    private UserService userService;

    @Autowired
public UserController(UserService userService) {
this.userService = userService;
}

8.3、@Autowired的工作流程

  • 默认通过byType的方式,在IOC容器中匹配类型相同的bean,为属性赋值

  • 如果有多个类型匹配的bean,则自动转换为通过byName的方式,在IOC容器中匹配id和属性名相同的bean,为属性赋值

  • 如果有多个类型匹配的bean,且在IOC容器中没有找到id和属性名相同的bean;

    则可以使用@Qualifier注解指定某个bean的id,将这个bean赋值给属性

如果有多个类型匹配的bean,且在IOC容器中没有找到id和属性名相同的bean,也没有使用@Qualifier注解指定将某个bean赋值给属性;则会抛出异常NoUniqueBeanDefinitionException

    @Autowired
@Qualifier("myUserService")
private UserService userService;

8.4、@Autowired的注意事项

在@Autowired注解中有一个属性required,默认值为true,意思是必要完成自动装配

如果在IOC容器中没有匹配的bean,就会抛出异常NoSuchBeanDefinitionException

为此可以将required属性的值设置为false,这样能装配就装配,不能装配就使用默认值

一般可以通过排查组件注解、组件扫描和@Qualifier注解,定位出为什么在IOC容器中没有匹配的bean

    @Autowired(required = false)
private UserService userService;

8、Spring之基于注解的自动装配的更多相关文章

  1. Spring中@Autowired注解与自动装配

    1 使用配置文件的方法来完成自动装配我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. ...

  2. 8 -- 深入使用Spring -- 2...6 Spring 4.0 增强的自动装配和精确装配

    8.2.6 Spring 4.0 增强的自动装配和精确装配 Spring提供了@Autowired 注解来指定自动装配,@Autowired可以修饰setter方法.普通方法.实例变量和构造器等.当使 ...

  3. Spring:基于注解的Spring MVC

    什么是Spring MVC Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据.业务与展现进行分离.从这样一个角度来说,Spring MVC ...

  4. @Resource注解完成自动装配

    @Resource注解是通过名字来自动装配的.在spring中自动装配的模式如果是通过名字来自动装配那么必须保证bean的名字和pojo 的属性名一直. 下面是详细代码:说明了@Resource注解是 ...

  5. springboot自动装配(1)---@SpringBootApplication注解怎么自动装配各种组件

    1.对于springboot个人认为它就是整合了各种组件,然后提供对应的自动装配和启动器(starter) 2.@SpringBootApplication注解其实就是组合注解,通过它找到自动装配的注 ...

  6. Spring入门(5)-自动装配Bean属性

    Spring入门(5)-自动装配Bean属性 本文介绍如何装配Bean属性. 0. 目录 ByName ByType constructor 默认自动装配 混合使用自动装配和显示装配 1. ByNam ...

  7. spring bean的作用域和自动装配

    1 Bean的作用域 l  singleton单列:整个容器中只有一个对象实例,每次去访问都是访问同一个对象  默认是单列 l  prototype原型: 每次获取bean都产生一个新的对象,比如Ac ...

  8. Spring boot 基于注解方式配置datasource

    Spring boot 基于注解方式配置datasource 编辑 ​ Xml配置 我们先来回顾下,使用xml配置数据源. 步骤: 先加载数据库相关配置文件; 配置数据源; 配置sqlSessionF ...

  9. Spring学习记录(十一)---使用注解和自动装配

    Spring支持用注解配置Bean,更简便. 上面的组件,是根据实际情况配的.比如写的一个类,是做业务处理的,那就用注解@Service表示服务层组件,以此类推.将整体分成不同部分. 要在xml加入c ...

  10. 使用Spring的JavaConfig 和 @Autowired注解与自动装配

    1 JavaConfig  配置方法 之前我们都是在xml文件中定义bean的,比如: 1 2 3 4 5 6 7 8 <beans xmlns="http://www.springf ...

随机推荐

  1. 2022-02-20:设计内存文件系统。 设计一个内存文件系统,模拟以下功能: ls: 以字符串的格式输入一个路径。如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字。如果它是一个文件

    2022-02-20:设计内存文件系统. 设计一个内存文件系统,模拟以下功能: ls: 以字符串的格式输入一个路径.如果它是一个文件的路径,那么函数返回一个列表,仅包含这个文件的名字.如果它是一个文件 ...

  2. 2021-10-20:分数到小数。给定两个整数,分别表示分数的分子numerator和分母denominator,以字符串形式返回小数。如果小数部分为循环小数,则将循环的部分括在括号内。输入: num

    2021-10-20:分数到小数.给定两个整数,分别表示分数的分子numerator和分母denominator,以字符串形式返回小数.如果小数部分为循环小数,则将循环的部分括在括号内.输入: num ...

  3. Apache Arrow DataFusion原理与架构

    本篇主要介绍了一种使用Rust语言编写的查询引擎--DataFusion,其使用了基于Arrow格式的内存模型,结合Rust语言本身的优势,达成了非常优秀的性能指标 DataFusion是一个查询引擎 ...

  4. vue项目提示TypeError: e.call is not a function

    最近运行vue项目老是提示TypeError: e.call is not a function 如上一运行到该页面就会提示这个错误,虽然页面功能都没受到影响,但是这个必定会给后期发布后的项目带来极大 ...

  5. python 学习之-----正则表达式

    mport re'''# re 模块regex 正则表达式,正则表达式应用范围:1爬虫:2自动化运维--开发自动化:# 什么是正则表达式:一套规则: 匹配字符串的规则# 能做什么 1 检测一个输入的字 ...

  6. Java关键字break、continue 、return的区别,嵌套循环,数组的概念以及数组案例

    一.关键字 break.continue .return的区别 1.break : 用于在switch..case中放置语句块穿透, ​ 用于跳出循环 // 从1-100 遇到7的倍数 break f ...

  7. 通过实例了解vue3.3更新的特征

    开场白 5月份,vue团队发布了 vue3.3. 这次小版本的发布主要解决了-- Vue 与 TypeScript 一起使用时的许多长期存在的痛点. 下面我们一起来学习一下vue3.3新特征 准备新新 ...

  8. DASCTF二进制专项部分Writeup

    easynote create:堆大小可以任意分配只要不超过0xFFF create()  unsigned __int64 create() { int i; // [rsp+0h] [rbp-20 ...

  9. 深度学习应用篇-计算机视觉-图像分类[2]:LeNet、AlexNet、VGG、GoogleNet、DarkNet模型结构、实现、模型特点详细介绍

    深度学习应用篇-计算机视觉-图像分类[2]:LeNet.AlexNet.VGG.GoogleNet.DarkNet模型结构.实现.模型特点详细介绍 1.LeNet(1998) LeNet是最早的卷积神 ...

  10. CKS 考试题整理 (03)-kube-bench 修复不安全项

    Context 针对 kubeadm 创建的 cluster 运行 CIS 基准测试工具时,发现了多个必须立即解决的问题. Task 通过配置修复所有问题并重新启动受影响的组件以确保新的设置生效. 修 ...