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命令检测…

浪潮信息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接着,继续安装。

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

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

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

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

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

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

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

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

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

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

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

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

SpringBoot集成Spring Security+jwt+kaptcha验证(简单实现,可根据实际修改逻辑)

参考文章 【全网最细致】SpringBoot整合Spring Security JWT实现用户认证 需求 结合jwt实现登录功能,采用自带/login接口实现权限控制 熟悉下SpringSecurity SpringSecurity 采用的是责任链的设计模式,是一堆过滤器链的组合,它有一条很…

03_W5500TCP_Client

上一节我们完成了W5500网络的初始化过程,这节我们进行TCP通信,w5500作为TCP客户端与电脑端的TCP_Server进行通信。 目录 1.TCP通信流程图: tcp的三次握手: tcp四次挥手: 2.代码分析: 3.测试&#xff1a…

Python游戏测试工具自动化遍历游戏中所有关卡

场景 游戏里有很多关卡(可能有几百个了),理论上每次发布到外网前都要遍历各关卡看看会不会有异常,上次就有玩家在打某个关卡时卡住不动了,如果每个关卡要人工遍历这样做会非常的耗时,所以考虑用自动化的方…

AI专题报告:2022年中国人工智能产业研究报告

今天分享的AI系列深度研究报告:《AI专题报告:2022年中国人工智能产业研究报告》。 (报告出品方:艾瑞咨询) 报告共计:112页 人工智能参与社会建设的千行百业 价值性、通用性、效率化为产业发展战略方向 …

淘宝API接口系列丨商品详情数据接口丨关键词搜索商品列表接口丨商品评论,销量接口

要对接淘宝API接口,可以按照以下步骤进行操作: 注册成为淘宝开放平台开发者,并创建一个应用。在应用创建页面,需要填写应用的名称、描述等信息,并设置应用的API权限等级。获取App Key和App Secret。在应用创建后&…

jira创建用例,与任务关联

项目用的jira,但之前的用例放在禅道上,或者归档于svn,都不是很好用,所以研究了下jira的用法 1、下载插件: synapseRT - Test management and QA in JIRA 完成后在tab会多出一个test 2、常用的功能 1、建立用例&#…

Gitlab+GitlabRunner搭建CICD自动化流水线将应用部署上Kubernetes

文章目录 安装Gitlab服务器准备安装版本安装依赖和暴露端口安装Gitlab修改Gitlab配置文件访问Gitlab 安装Gitlab Runner服务器准备安装版本安装依赖安装Gitlab Runner安装打包工具安装docker安装java17安装maven 注册Gitlab Runner 搭建自动化部署准备SpringBoot项目添加一个Co…