Spring~五种存储Bean对象的类注解、方法注解(@Bean)以及Bean对象的获取

news2024/11/17 5:56:31

目录

五种存储Bean对象的类注解

​@Controller 

@Service

@Repository 

@Component

@Configuration

方法注解@Bean

使用@Bean注解的常见问题

当一个类型有多个实例对象,使用类型获取就会报错

在容器中找不到Bean,不论通过什么方式来获取Bean对象都会报错


五种存储Bean对象的类注解

五种类注解分别为@Controller、@Service、@Repository、@Component、@Configuration。其中@Configuration是将其注册为配置类对象,在项目启动时需要准备一些配置信息,一般通过配置类来初始化,其他类注解都是注册为普通的Bean对象,主要是在软件分层后,在不同的分层使用

@Controller 

@Controller注解是控制器存储,用来接收http请求并返回响应,其默认是单例的方式注册Bean对象

UserController类

package org.example.controller;

import org.springframework.stereotype.Controller;

@Controller
public class UserController {
}
package org.example;

import org.example.controller.UserController;
import org.example.model.Bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class APP {
    public static void main(String[] args) {
        //ApplicationContext是Spring容器的顶级接口
        //AnnotationConfigApplicationContext其中的一个实现类,作用是:
        //(1)扫描指定的包路径下,使用了Spring框架注解的类
        //(2)扫描到后,注册这些类到容器中=>框架帮我们new对象,及注入对象的依赖关系(属性赋值)
        ApplicationContext context = new AnnotationConfigApplicationContext("org.example");
        //获取Bean对象有两种方式:
        // (1)通过bean的类型来获取
        UserController bean1 = context.getBean(UserController.class);
        //(2)通过bean的id(也叫bean的名称)
        UserController bean2 = (UserController) context.getBean("userController");
        System.out.println(bean1 == bean2);
    }
}

 

通过代码,可以看出@Controller注解是以单例模式注册Bean对象的 

@Service

@Service注解是服务存储,是用于处理业务逻辑的分层,其默认是单例的方式注册Bean对象。

package org.example.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
}
package org.example;
import org.example.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class APP {
    public static void main(String[] args) {
        //ApplicationContext是Spring容器的顶级接口
        //AnnotationConfigApplicationContext其中的一个实现类,作用是:
        //(1)扫描指定的包路径下,使用了Spring框架注解的类
        //(2)扫描到后,注册这些类到容器中=>框架帮我们new对象,及注入对象的依赖关系(属性赋值)
        ApplicationContext context = new AnnotationConfigApplicationContext("org.example");
        //获取Bean对象有两种方式:
        // (1)通过bean的类型来获取
        UserService bean1 = context.getBean(UserService.class);
        //(2)通过bean的id(也叫bean的名称)
        UserService bean2 = (UserService) context.getBean("userService");
        System.out.println(bean1 == bean2);
    }
}

 

@Repository 

@Repository注解是仓库存储,数据访问层,一般是数据库的操作,其默认也是单例的方式注册Bean对象

@Component

@Component注解是组件存储,除了明确含义的类注解作用外,其他的作用就可以使用@Component来进行注解,其默认也是单例的方式注册Bean对象

@Configuration

@Configuration注解主要是配置存储,Spring容器启动时就初始化配置

方法注解@Bean

@Bean方法注解:

· 只有其所在的类被注册到容器中,方法上的@Bean注解才能生效

· @Bean注解的方法,所在的类,必须使用上述的五种类注解之一

· @Bean注解一般使用在@Configuration注解的类中,比较规范

代码演示

创建User类

 @Data:lombok注解,表示自动生成getter、setter、hashcode、toString等等

package org.example.model;
import lombok.Data;
@Data
public class User {
    private String userName;
}

创建Config配置类

package org.example.config;
import org.example.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
    //方法上使用Bean注解表示注册一个Bean对象到容器中
    //方法的名称,就是bean ID(名称),方法的返回值就是注册的实例对象
    //一般是public修饰的实例方法
    @Bean
    public User TestBean1() {
        User user = new User();
        user.setUserName("TestBean1");
        return user;
    }
    @Bean
    public User TestBean2() {
        User user = new User();
        user.setUserName("TestBean2");
        return user;
    }
}

@Bean注解搭配类注解,将对象存储到Spring容器中,此时就可以通过方法名来获取到注册到容器中的Bean对象

package org.example;
import org.example.config.AppConfig;
import org.example.controller.UserController;
import org.example.model.User;
import org.example.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class APP {
    public static void main(String[] args) {
        //ApplicationContext是Spring容器的顶级接口
        //AnnotationConfigApplicationContext其中的一个实现类,作用是:
        //(1)扫描指定的包路径下,使用了Spring框架注解的类
        //(2)扫描到后,注册这些类到容器中=>框架帮我们new对象,及注入对象的依赖关系(属性赋值)
        ApplicationContext context = new AnnotationConfigApplicationContext("org.example");
        User user = (User) context.getBean("testBean1");
        System.out.println(user);
        User user1 = (User) context.getBean("testBean2");
        System.out.println(user1);
    }

 

使用@Bean注解的常见问题

当一个类型有多个实例对象,使用类型获取就会报错

例如下列代码

package org.example.config;
import org.example.model.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
    //方法上使用Bean注解表示注册一个Bean对象到容器中
    //方法的名称,就是bean ID(名称),方法的返回值就是注册的实例对象
    //一般是public修饰的实例方法
    @Bean
    public User testBean1() {
        User user = new User();
        user.setUserName("testBean1");
        return user;
    }
    @Bean
    public User testBean2() {
        User user = new User();
        user.setUserName("testBean2");
        return user;
    }
}

通过User类型注册了两个Bean对象,此时如果再通过User类型来获取Bean对象就会报错

public class APP {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext("org.example");
        User user = (User) context.getBean(User.class);
        System.out.println(user);
    }

 此时就只能通过@Bean注解的方法名来获取Bean对象

在容器中找不到Bean,不论通过什么方式来获取Bean对象都会报错

在学习过程中,出现这种问题有两种情况,一种是扫描的包名写错时,就会出现这种错误

另一种是配置类未加注解时,也出现了这种错误 

 

 

 

 

 

 

 

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

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

相关文章

建设一个互联网医院系统要花多少钱?

建设一个互联网医院系统要花多少钱?很多人在筹备调研互联网医院建设后,仍然有很多问题答案不清楚,今天就给大家来聊一聊。 其实互联网医院看似简单,实则是一个较为复杂的过程,要想合法合规的开展线上诊疗业务&#x…

雷电模拟器dnconsole命令汇总

雷电模拟器之文件操作 删除相册中的文件 ldconsole adb --index 0 --command "shell rm /sdcard/DCIM/1.png" 雷电模拟器应用操作 假设启动名为test1的模拟器, 以抖音为例 : 判断应用是否安装: ldconsole adb --name test1 --co…

姿态识别+校准|视觉技术新突破

技术实现路径及优势 概述:通过2D图像序列加2D图像景深序列,利用复杂的3D重建算法与人体骨架模型的拟合还原姿态节点信息,进而对各种姿态进行准确的数学分析,达到准确高效识别姿态的效果;摆脱人脸3D训练样本真值依赖&am…

【输出重定向】Windows下 cmd 、powershell输出重定向

目录一、cmd和powershell二、什么是输入输出重定向三、语法及示例一、cmd和powershell 大家如果只用过Windows,可能cmd接触的相对多一点。按win r 输入cmd即可打开。我一般用的是powershell。 cmd:     cmd是command的缩写,即命令提示符。是提示命…

怎么手写转文字?借助这3款工具轻松实现

许多小伙伴在日常中会遇到需要把手写文字转换为电子版的情况,例如领导给一份手稿让你整理,亦或是平时自己随笔记录的一些内容想把它分享到平台上等等。但是手动逐字敲键盘输出太费时费神啦,所以今天要传授给大家一个好方法,那就是…

HTML5期末考核大作业,网站——青岛民俗 7页。 美丽家乡 学生旅行 游玩 主题住宿网页

👨‍🎓静态网站的编写主要是用 HTML DⅣV CSSJS等来完成页面的排版设计👩‍🎓,一般的网页作业需要融入以下知识点:div布局、浮动定位、高级css、表格、表单及验证、js轮播图、音频视频Fash的应用、uli、下拉…

LeetCode-808-分汤

1、动态规划法 我们可以利用二维数组dp[i][j]dp[i][j]dp[i][j]来记录当汤A的体积为i,汤B的体积为j时的概率。由于体积均为25的倍数,为了方便计算我们可以将所有体积都除以25。由于误差范围为10−510^{-5}10−5,我们可以计算得出当$n\ge179时…

Day08--自定义组件的插槽

1.什么是插槽 **************************************************************************************************************************************************************************************************************************** 2.单个插槽 我的操作&am…

一个小台灯 之 微信小程序开发日志

微信小程序开发日志 小程序只能使用https和后台服务器进行post请求和get请求,使用https的连接需要的微信小程序的后台对域名进行备份。 在备份的时候也只能通过域名,不能通过公网IP备份。 一、基础 微信小程序的一个界面主要分为四个文件 index.json…

剖析一下“抢茅台“脚本底层逻辑

本文作者:梁冬冬 前言: 今天你撸茅台了么👇? 撸茅台已经成为社会现象🙌,茶余饭后讨论的最佳实践😇 2022年双十一大促已经完美收官,兄弟姐妹克服种种困难与挑战… 备战的会议室忙碌…

用户规模持续上涨,外卖行业未来的发展趋势如何?还能从里盈利?

外卖跑腿行业随着互联网移动支付及网络的普及得到了高速发展,相关数据显示2022年外卖行业规模进一步上升至8117亿元,外卖市场发展速度增速加快,并且也带动了各大主流外卖平台的发展,在2021年外卖用户规模达5.44亿人,占…

从工厂打螺丝到月薪9.5k测试工程师,我该满足吗?

以前我比较喜欢小米那句“永远相信美好的事情即将发生”,后来发现如果不努力不可能有美好的事情发生! 初中毕业进厂5年,创业经商多次战败,为了生计辗转奔波 初中毕业后我就进了工厂,第一份工作是做模具加工。从500元一…

Python:用一行代码在几秒钟内抓取任何网站

如果你正在寻找最强大的 Python 抓取工具?不要再看了!这一行代码将帮助你立即启动并运行。 Scrapeasy Scrapeasy 是一个 Python 库,可以轻松抓取网页并从中提取数据。它可用于从单个页面抓取数据或从多个页面抓取数据。它还可用于从 PDF 和 …

算法设计与分析 SCAU10346 带价值的作业安排问题

10346 带价值的作业安排问题 时间限制:1000MS 代码长度限制:10KB 提交次数:25 通过次数:9 题型: 编程题 语言: G;GCC;VC;JAVA Description 已知n项作业E{1, 2, … ,n} 需要完成,只有一台机器,同一时刻至多完成一个作业, 而且每项作业需要…

Msyql数据库入门基础教学

目录 文章目录二、数据库三、为什么要使用数据库?四、 数据库相关的概念⑤SQL语句操作修改表insert基本使用update语句delete语句二、数据库 数据库的种类有许多,企业中常用的有MySQL、Oracle,其中MySQL使用最多,是因为他开源免费…

和外国bi相比,国产bi软件更适合中国企业

提起国外bi和国产bi软件之争,经常有人说国外bi软件起步更早,经验更丰富,功能更强大。无可否认国外bi软件发展起步早,也确实功能强大,但当他们来到中国却往往会面临着本土化难题,经常出现水土不服现象&#…

【Hack The Box】linux练习-- Jarvis

HTB 学习笔记 【Hack The Box】linux练习-- Jarvis 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月17日🌴 &#x1f3…

基于docker-k8s的web集群

目录 网络拓扑图 基于docker-k8s的web集群搭建 项目描述 详细步骤 1、集群ip地址的规划 2、Ansible批量部署服务器 3、创建k8s集群 4、配置NFS服务 5、pv,pvc,与NFS融合 6、配置Nginx负载均衡 网络拓扑图 基于docker-k8s的web集群搭建 项目描述…

web前端期末大作业基于html+css+javascript+jquery制作家乡主题风景网页设计与实现——张家口

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

【Hack The Box】Linux练习-- Popcorn

HTB 学习笔记 【Hack The Box】Linux练习-- Popcorn 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月17日🌴 &#x1f…