SpringIOC第二课,@Bean用法,DI详解,常见面试题Autowired VS Resource

一、回顾

但是我们之前MVC时候,在页面上,为什只用Controller,不用其他的呢?

用其他的好使吗?(我们可以在这里看到,出现404的字样)

@Service
@ResponseBody
public class TestController {@RequestMapping("/test")public String test(){return "测试Controller和其他注解的区别";}
}

但是Controller就是好使的,事实上Spring对Controller有更屌的权限

二、@Bean用法

五大注解只能加在类上,并且只能加在自己的代码上

如果我引入一个第三方的jar包,也希望交给Spring管理,是没有办法加五大注解

第一个应用场景:可以使用@Bean, @Bean是方法注解

在这里,我们可以看到一个问题,就是两个引用指向的是一个对象(看后面的那几位,说明地址相同)

第二个应用场景:那么假如说要求是一个类,定义多个对象,比如说数据库操作,定义多个数据源使用@Bean

@Bean相当于是一个上交作业的过程,交完了作业,要告诉老师,交完作业了

所以也就是说@Bean要搭配五大注解来使用并且当一个类型存在多个bean中,采用多个Bean的时候,我们就不能使用类型来获取对象了。

我们上节课学的注释

是getBean+方法名(小驼峰形式,特殊情况(两个首字母都是大写,那么她就会变成小写)

@Bean需要加的是方法名(方法名不遵守小驼峰形式)

如何进行相应的传递参数

那么我们在应用中,一般不会让写死

假如对Bean的方法中的内容进行传参数,则定义一个这种方法,当然现在这个也是死的,但是以后可以用这种方法变成“活的”

@Configuration
public class BeanConfig {@Beanpublic String name(){return "zhangsan";}@Beanpublic UserInfo UserInfo(String string){UserInfo userInfo=new UserInfo();userInfo.setName(string);return  userInfo;}

Spring的扫描文件约定

SpringBoot是属于我们的开发框架(其实叫做开发框架,更感觉像是打开idea,后呈现的这个结构)

SpringBoot特点:约定大于配置,约定到,放到哪里就扫描当前文件夹里面的所有文件,但是假如说你硬是想在一个小的目录里面去执行(也有方法,加路径)(约定的体现之一扫描路径,默认的扫描路径是:启动类所在的目录及其子孙目录

放到这个文件夹里面会报错

解决方式就是

//默认扫描当前类的目录及子目录
在前面加上这个注解(路径自己填)@ComponentScan("com.example")
@ComponentScan("com.example")
@SpringBootApplication
public class IoCtryApplication {public static void main(String[] args) {//启动类是帮助我们启动spring,这个命令可以返回一个spring

DI详解

DI依赖注入,属性装配“依赖装配”,

只要加上这些依赖注入(就跟我们导包一样,没导包不能用)

1.属性注入 @Autowired

(相当于导游,带着去找这个东西)和上面那个匹配的一致,和那个@Bean传递参数一样。

@Controller
public class UserController {
//⚠️假如没有下面的这个Autowired注释,那么就会报空指针异常
@Autowired
private UserService userService;public void prin(){userService.doService();System.out.println("春节快乐");
}
}
UserController userController=context.getBean(UserController.class);userController.prin();

2.构造方法注入

如下图


@Controller
public class UserController {
//@Autowired
private UserService userService;private UserInfo userInfo;
//⚠️注意此时加完构造函数之后,还要把无参数的也写一遍,因为无参数的构造函数,有很多东西在用,所以一旦经过修改,就会让使用无参数的报错。public UserController(){
}
@Autowired
public  UserController(UserService userService){this.userService=userService;
}public  UserController(UserInfo userInfo,UserService userService){this.userService=userService;this.userInfo=userInfo;}
public void prin(){userService.doService();System.out.println("春节快乐");
}

3.Setter方法注入

三种注入的优缺点

1.属性注入:

优点:简洁方便

缺点:只能用于IOC容器,如果非IOC容器无法使用,并且只有在使用的时候才会出现NPE(空指针异常),并且不能修饰Final。

2.构造函数注入:

优点:

(1).可以注入final属性(通过构造方法的形式)。

(2).注入的对象不会被修改(因为除非你再new,不然构造方法不能被再次调用),依赖对象使用之前一定会被初始化,因为依赖在类的构造方法中执行的,构造方法是类加载阶段就会执行的方法

(3).通用型好:构造方法是JDK支持的

缺点:

代码会比较繁琐

Setter注入

优点:方便类实例化之后,重新对该对象进行配置或者注入

缺点:不能修饰Final,注入的对象肯会被改变,因为setter方法可能会被多次调用,就有被修改的风险。

当程序同一个类型,多个对象时候,使用@AutoWired会报错

这里说的情况是这样的一个代码

package com.example.IOCtry;import com.example.IOCtry.config.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;@Controller
public class UserController {
@Autowired                //⚠️
private UserService userService;
@Autowired                //⚠️
private UserInfo userInfo;
//注意此时加完构造函数之后,还要把无参数的也写一遍,因为无参数的构造函数,有很多东西在用,所以一旦经过修改,就会让使用无参数的报错。//public UserController(){
//}
//
//public  UserController(UserService userService){
//    this.userService=userService;
//}
//
//    public  UserController(UserInfo userInfo,UserService userService){
//        this.userService=userService;
//        this.userInfo=userInfo;
//    }
//   @Autowired
//    public  void setUserController(UserService userService){
//        this.userService=userService;
//    }
public void prin(){userService.doService();System.out.println(userInfo);System.out.println("春节快乐");
}
}

改法一需要改属性名字:让属性名和方法名字一致

package com.example.IOCtry;import com.example.IOCtry.config.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;@Controller
public class UserController {
@Autowired
private UserService userService;
@Autowired
private UserInfo UserInfo1;       //⚠️这个名字改成和方法名字一摸一样
//注意此时加完构造函数之后,还要把无参数的也写一遍,因为无参数的构造函数,有很多东西在用,所以一旦经过修改,就会让使用无参数的报错。//public UserController(){
//}
//
//public  UserController(UserService userService){
//    this.userService=userService;
//}
//
//    public  UserController(UserInfo userInfo,UserService userService){
//        this.userService=userService;
//        this.userInfo=userInfo;
//    }
//   @Autowired
//    public  void setUserController(UserService userService){
//        this.userService=userService;
//    }
public void prin(){userService.doService();System.out.println(UserInfo1);System.out.println("春节快乐");
}
}
不想改名的第二种方法:加上@Primary
//这个是在另一个类中搞的方法
package com.example.IOCtry.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;@Configuration
public class BeanConfig {@Beanpublic String name(){return "zhangsan";}@Beanpublic String name2(){return "wangwu";}// ⚠️@Primary这个只有加上,程序才会不发生错误,会执行这个Setter方法@Beanpublic UserInfo UserInfo1(String name2){UserInfo userInfo=new UserInfo();userInfo.setName(name2);return  userInfo;}@Beanpublic UserInfo userInfo2(){UserInfo userInfo=new UserInfo();userInfo.setId(2);userInfo.setAge(22);userInfo.setName("lclyr");return  userInfo;}}
改法3(优先):使用@Qualifier
package com.example.IOCtry;import com.example.IOCtry.config.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;@Controller
public class UserController {
@Autowired
private UserService userService;
@Qualifier("userInfo2")            //⚠️
@Autowired
private UserInfo userInfo;
//注意此时加完构造函数之后,还要把无参数的也写一遍,因为无参数的构造函数,有很多东西在用,所以一旦经过修改,就会让使用无参数的报错。//public UserController(){
//}
//
//public  UserController(UserService userService){
//    this.userService=userService;
//}
//
//    public  UserController(UserInfo userInfo,UserService userService){
//        this.userService=userService;
//        this.userInfo=userInfo;
//    }
//   @Autowired
//    public  void setUserController(UserService userService){
//        this.userService=userService;
//    }
public void prin(){userService.doService();System.out.println(userInfo);System.out.println("春节快乐");
}
}

改法4(优先):使用@Resource(name="userInfo2")

package com.example.IOCtry;import com.example.IOCtry.config.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;import javax.annotation.Resource;@Controller
public class UserController {
@Autowired
private UserService userService;
//@Qualifier("userInfo2")@Resource(name="userInfo2")
@Autowired
private UserInfo userInfo;
//注意此时加完构造函数之后,还要把无参数的也写一遍,因为无参数的构造函数,有很多东西在用,所以一旦经过修改,就会让使用无参数的报错。//public UserController(){
//}
//
//public  UserController(UserService userService){
//    this.userService=userService;
//}
//
//    public  UserController(UserInfo userInfo,UserService userService){
//        this.userService=userService;
//        this.userInfo=userInfo;
//    }
//   @Autowired
//    public  void setUserController(UserService userService){
//        this.userService=userService;
//    }
public void prin(){userService.doService();System.out.println(userInfo);System.out.println("春节快乐");
}
}

三、常见面试题Autowired VS  Resource

@Autowired:是Spring开发的框架,@Resource是JDK提供的框架

@Autowired:默认是按照类型来去注入,假如说同一个类型存在多个对象,那么就按名称匹配,假如名称匹配不上,那么就会报错,相对于Autowired来说,@Resource支持更多的参数设置,如name设置,根据名称获取Bean​​​​​​​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207004.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes安装kubesphere

前置默认都安装了k8s,且k8s都正常 1、nfs文件系统 1.1、安装nfs-server # 在每个机器。 yum install -y nfs-utils# 在master 执行以下命令 echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports# 执行以下命令,启动 …

数字化和数智化一字之差,究竟有何异同点?

在2023杭州云栖大会的一展台内,桌子上放着一颗番茄和一个蛋糕,一旁的机器人手臂融入“通义千问”大模型技术后,变得会“思考”:不仅能描述“看”到了什么,还能确认抓取的是番茄而不是蛋糕。 “传统的机械臂通常都只能基…

Post Quantum Fuzzy Stealth Signatures and Applications

目录 笔记后续的研究方向摘要引言贡献模块化框架模糊构造实施适用于FIDO Post Quantum Fuzzy Stealth Signatures and Applications CCS 2023 笔记 后续的研究方向 摘要 自比特币问世以来,基于区块链的加密货币中的私人支付一直是学术和工业研究的主题。隐形地址…

cmd命令 常用的命令

网络工作为常年公司里的背锅侠,不得不集齐十八般武艺很难甩锅。像cmd命令这种好用又好上手的技术,就是网络工程师上班常备技能。 只要按下快捷键 winR,输入cmd回车,然后输入cmd命令。 像我自己,我就经常用cmd命令检测…

在UBUNTU上使用Qemu和systemd-nspawn搭建RISC-V轻量级用户模式开发环境

参考链接 使用Qemu和systemd-nspawn搭建RISC-V轻量级用户模式开发环境 - 知乎 安装Qemu sudo apt updatesudo apt -y install qemu-user-binfmt qemu-user-static systemd-container sudo apt -y install zstd 配置环境 RISCV_FILEarchriscv-2023-10-09.tar.zstwget -c ht…

浪潮信息KeyarchOS——保卫数字未来的安全防御利器

浪潮信息KeyarchOS——保卫数字未来的安全防御利器 前言 众所周知,目前流行的操作系统有10余种,每一款操作系统都有自己的特点。作为使用者,我们该如何选择操作系统。如果你偏重操作系统的安全可信和稳定高效,我推荐你使用浪潮信…

openEuler JDK21 部署 Zookeeper 集群

zookeeper-jdk21 操作系统:openEuler JDK:21 主机名IP地址spark01192.168.171.101spark02192.168.171.102spark03192.168.171.103 安装 1. 升级内核和软件 yum -y update2. 安装常用软件 yum -y install gcc gcc-c autoconf automake cmake make \zl…

E: 无法获得锁 /var/lib/dpkg/lock-frontend。锁正由进程 6253(apt-get)持有

问题 解决方案 sudo rm /var/lib/dpkg/lock-frontend接着,继续安装。

el-from表单实现lable字体大小改变

<el-form-item label"活动名称" class"my-form"> <el-input v-model"form.name" style"width: 80%;" ></el-input> </el-form-item> <style scoped lang"less"> //给当前页面所以的lable都字…

Fiddler抓包测试

模拟弱网测试 操作&#xff1a;一、Rules - Customize Rules &#xff08;快捷键CtrlR&#xff09;弹出编辑器 二、接着CtrlF查找m_SimulateModem标志位 三、默认上传300ms&#xff0c;下载150ms 四、更改后&#xff0c;继续Rules - Performances - Simulate Modem Speeds勾上 …

【复杂网络建模】——基于Graph Convolutional Networks (GCN)进行链接预测

目录 一、复杂网络建模 二、图嵌入方法&#xff08;Graph Convolutional Networks (GCN) &#xff09; 1. 图表示&#xff1a; 2. 邻接矩阵&#xff08;Adjacency Matrix&#xff09;&#xff1a; 3. 图卷积层&#xff08;Graph Convolutional Layer&#xff09;&#xff…

【C语言】7-32 刮刮彩票 分数 20

7-32 刮刮彩票 分数 20 全屏浏览题目 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 “刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示&#xff1a; 每次游戏玩家会拿到一张彩票&#xff0c;上面会有 9 个数字&#xff0c;分别为数字 1 到数字 9&#xf…

Python 中 Thread 线程的用法

使用thread一直没记录过&#xff0c;最近又忘记具体用法了&#xff0c;记录下 Thread()是Python标准库中threading模块的一个类&#xff0c;它可以用来创建和管理线程。线程是一种并发执行的方式&#xff0c;可以让你的程序在等待某些事件的同时&#xff0c;执行其他的任务。例…

排序-插入排序与希尔排序

文章目录 一、插入排序二、希尔排序 一、插入排序 思路&#xff1a; 当插入第i(i>1)个元素时&#xff0c;前面的array[0],array[1],…,array[i-1]已经排好序&#xff0c;此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较&#xff0c;找到插入位置即将…

Qt Rsa 加解密方法使用(pkcs1, pkcs8, 以及文件存储和内存存储密钥)

Qt RSA 加解密 完整使用 密钥格式&#xff1a; pkcs#1pkcs#8 如何区分密钥对是PKCS1还是PKCS8&#xff1f; 通常PKCS1密钥对的开始部分为&#xff1a;-----BEGIN RSA PRIVATE KEY-----或 -----BEGIN RSA PUBLIC KEY-----。而PKCS8密钥对的开始部分为&#xff1a;-----BEGIN…

基于Springboot+mybatis+mysql+jsp招聘网站

基于Springbootmybatismysqljsp招聘网站 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型&#xff1a;Java EE项目 项目名称&#xff1a;基于SPringBoot的照片网站 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 前端技术&…

Swagger Array 逐步解密:带你简化开发工作

Swagger 允许开发者定义 API 的路径、请求参数、响应和其他相关信息&#xff0c;以便生成可读性较高的文档和自动生成客户端代码。而 Array &#xff08;数组&#xff09;是一种常见的数据结构&#xff0c;用于存储和组织多个相同类型的数据元素。数组可以有不同的维度和大小&a…

C++初学教程三

目录 一、运算符 一、自增自减运算符 二、位运算符 三、关系运算符

情绪管理法则

感受情绪&#xff0c;聆听情绪&#xff0c;接纳情绪&#xff0c;管理情绪&#xff0c;将自己从黑暗中拯救出来 感受情绪的价值&#xff0c;了解情绪产生的原因 其实情绪没有好坏之分&#xff0c;负面情绪是人体自我保护的产物 改变认知方式&#xff0c;做情绪的主人 典型案例…

轨道电流检测IC——FP355,助力蓄电池充电器、SPS(适配器)、电池管理系统、多口快充充电器的优雅升级

目录 一、FP355概述 二、FP355特点 三、FP355应用 随着移动设备的普及和人们对电力需求的不断增长&#xff0c;充电器的安全性和充电效率成为了重要的关注点。 作为一种能够精确检测电流的集成电路&#xff0c;轨道电流检测IC——FP355是个不错的选择。它不仅广泛应用于蓄电…