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. 2021-10-14:被围绕的区域。给你一个 m x n 的矩阵 board ,由若干字符 ‘X‘ 和 ‘O‘ ,找到所有被 ‘X‘ 围绕的区域,并将这些区域里所有的 ‘O‘ 用 ‘X‘ 填充。力扣1

    2021-10-14:被围绕的区域.给你一个 m x n 的矩阵 board ,由若干字符 'X' 和 'O' ,找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充.力扣1 ...

  2. pg_enterprise_views偶然发现的PG神仙插件!

    一直从事数据库相关的工作,对于PG而言最大的问题其实是在运维管理方面,其缺乏有效且直观成体系的系统表,苦觅良久,今日在PG官网中发现了一款新收录的免费插件,其提供了数十张系统表,内容涵盖了从操作系统到 ...

  3. Windows与网络基础

    Windows 基础命令 一.目录和文件的应用操作 1.cd命令 cd /d d:\ //切换到d盘目录,因为改变了驱动器,所以要加上/d选项 cd c:\ //如果没有改变驱动器号,就不需要加/d选 ...

  4. openlayers Text字体大小设置

    今做一个app版的ol地图,发现区域太小显示拥挤,于是想把字体改小,看起来匀称点,于是盯紧了font属性使劲改 老是不听咋整呢?网上找大佬 于是找到了得到了各路大神鼎力相助 如: 赶紧跑去试试,原来这 ...

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

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

  6. NFS远程挂载

    NFS远程挂载 一.概述 NFS是一种基于TCP/IP 传输的网络文件系统协议.通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源 NAS存储: NFS服务的实现依赖于RPC ...

  7. GPT3的性能评估:比较不同语言、文本和任务的差异

    目录 GPT-3 性能评估:比较不同语言.文本和任务的差异 近年来,自然语言处理 (NLP) 和人工智能领域取得了巨大的进展,其中 GPT-3 是目前最为先进的语言模型之一.GPT-3 拥有超过 17 ...

  8. Java打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

    代码如下: public static void main(String[] args) { int a,b,c; for(int num = 100;num <= 999;num++) { a ...

  9. 记一次 .NET 某埋线管理系统 崩溃分析

    一:背景 1. 讲故事 经常有朋友跟我反馈,说看你的文章就像看天书一样,有没有一些简单入手的dump 让我们先找找感觉,哈哈,今天就给大家带来一篇入门级的案例,这里的入门是从 WinDbg 的角度来阐 ...

  10. Visual Studio Code调试和发布ASP.NET Core Web应用

    前言 上一篇文章主要讲了Visual Studio Code安装C#开发工具包并编写ASP.NET Core Web应用有兴趣的同学可以去看看,今天咱们主要是要讲讲如何在VS Code中调试和发布AS ...