【IocDI】_存储Bean的五大类注解及getBean的使用

news2025/2/4 8:49:10

目录

1. Bean的存储

1.1 类注解

1.1.1 @Controller:控制器存储

1.1.2 @Service:服务存储

1.1.3 @Repository:仓库存储

1.1.4 @Component:组件存储

1.1.5 @Configuration:配置存储

1.2 五大类注解之间的关系

2. getBean的使用

2.1 关于Spring context

2.2 关于getBean方法获取Bean的方式

2.3 根据不同参数获取对象

2.4 获取不同的Bean


1. Bean的存储

在上文实现IoC基本存取功能的两个注解中,要把某个对象交给IOC容器管理,需要在类上添加⼀个@Component注解。

Spring框架为了更好的服务web应⽤程序, 提供了更丰富的注解。

共有两类注解类型可以实现:

(1) 类注解:@Controller、@Service、@Repository、@Component、@Configuration;

(2)方法注解:@Bean;

1.1 类注解

1.1.1 @Controller:控制器存储

在Controller包下创建一个UserController类:

package com.example.iocdemo1.Controller;
import org.springframework.stereotype.Controller;

@Controller
public class UserController {
    public void doController(){
        System.out.println("do Controller...");
    }
}

@Controller对应Controller层; 

1.1.2 @Service:服务存储

在Service包下创建一个UserService类:

package com.example.iocdemo1.Service;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void doService(){
        System.out.println("doService...");
    }
}

@Service对应Service层; 

1.1.3 @Repository:仓库存储

在Repository包下创建一个UserRepository类:

package com.example.iocdemo1.Repo;

import org.springframework.stereotype.Repository;

@Repository
public class UserRepository {
    public void doRepository(){
        System.out.println("doRepository...");
    }
}

@Repository对应Dao层; 

1.1.4 @Component:组件存储

在Component包下创建一个UserComponent类:

package com.example.iocdemo1.Component;

import org.springframework.stereotype.Component;

@Component
public class UserComponent {
    public void doComponent(){
        System.out.println("doComponent...");
    }
}

在系统中,对于非Controller层、非Service层和非Dao层的其他bean,使用@Component注解实现存储;

1.1.5 @Configuration:配置存储

在Config包下创建一个UserConfig类:

package com.example.iocdemo1.Config;

import org.springframework.context.annotation.Configuration;

@Configuration
public class UserConfig {
    public void doConfig(){
        System.out.println("doConfig...");
    }
}

在系统中,对于配置相关的bean使用@Configuration实现存储;

1.2 五大类注解之间的关系

1、Spring提供的以上更为细化的注解,可以帮助程序员直观了解到当前类的用途:

@Controller:控制层,接收请求, 对请求进行处理, 并进行响应;
@Servie:业务逻辑层, 处理具体的业务逻辑;
@Repository:数据访问层,也称为持久层。负责数据访问操作;

(@Controller、@Service、@Repository与三层架构分别对应)

@Configuration:配置层, 处理项⽬中的⼀些配置信息;

2、@Controller、@Service、@Repository、@Configuration都是@Component的衍生类,都是基于@Component实现的:(Alt+点击查看注解声明)

3、如果某一个Bean需要被外界访问,则必须使用@Controller

@Controller是访问程序的入口。

4、五大注解只能加在类上,并且只能加在自己的代码上。如果引入了一个第三方的Jar包也希望交给Spring管理,则无法加五大注解。可以使用@Bean注解,这是一个方法注解。具体内容另见后文。

2. getBean的使用

2.1 关于Spring context

对于Spring项目,项目创建成功后,在左侧目录中可见一个启动类:

在启动类中对以上五大类注解是否实现将对应bean存放到Spring容器中进行测试。

启动类初始页面如下:

采用ApplicationContext 类型的变量接收Spring应用启动的返回值,接收的是Spring的运行环境,Spring的运行环境即Spring context,通常将其称为Spring上下文:

@SpringBootApplication
public class IoCDemo1Application {
    public static void main(String[] args) {
        // Spring上下文(表示启动Spring应用,返回Spring的运行环境)
        ApplicationContext context=
                SpringApplication.run(IoCDemo1Application.class, args);
    }
}

2.2 关于getBean方法获取Bean的方式

context是一个ApplicationContext类型的变量,提供了一个getBean方法,根据传参不同可通过不同方式获取对象:

现以存储器对象(Controller)为例,使用getBean方法根据类型获取UserController对象并调用其方法:

package com.example.iocdemo1;

import com.example.iocdemo1.Controller.UserController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class IoCDemo1Application {
    public static void main(String[] args) {
        // Spring上下文
        ApplicationContext context=
                SpringApplication.run(IoCDemo1Application.class, args);
        // 根据类型获取Bean
        UserController bean = context.getBean(UserController.class);
        bean.doController();
    }
}

此时在控制台,就会有对应的输出。过程分析如下:

若无对应的@Controller注解,(现注释掉@Controller注解,再启动程序),则运行项目时会报未找到Bean异常:

2.3 根据不同参数获取对象

在getBean的各种参数调用中,最常用的是根据类型、名称、类型和名称三种方式。

现以服务对象(Service)为例,使用getBean方法根据类型获取UserService对象并调用其方法:

package com.example.iocdemo1;

import com.example.iocdemo1.Service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class IoCDemo1Application {
    public static void main(String[] args) {
        // Spring上下文
        ApplicationContext context=
                SpringApplication.run(IoCDemo1Application.class, args);

        // 从context中根据类型获取Bean
        UserService userService1=context.getBean(UserService.class);
        userService1.doService();

        // 从context中根据名称获取Bean
        UserService userService2=(UserService)context.getBean("userService");
        userService2.doService();

        // 从context中根据名称和类型获取Bean
        UserService userService3 = context.getBean("userService", UserService.class);
        userService3.doService();
    }
}

此时在控制台就会有bean的方法的相关输出:

 

注:关于根据名称获取Bean的细节:Bean的名称规范:

Spring官网对于bean的介绍如下:

若需了解更多内容,详见链接如下:Bean Overview :: Spring Framework

2.4 获取不同的Bean

对应1.1 部分关于@Controller、@Service、@Repository、@Configuration、@Component实现的不同Bean,以通过类型获取Bean为例,获取不同的Bean:

package com.example.iocdemo1;

import com.example.iocdemo1.Component.UserComponent;
import com.example.iocdemo1.Config.UserConfig;
import com.example.iocdemo1.Controller.UserController;
import com.example.iocdemo1.Repo.UserRepository;
import com.example.iocdemo1.Service.UserService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;

@SpringBootApplication
public class IoCDemo1Application {
    public static void main(String[] args) {
        // Spring上下文
        ApplicationContext context=
                SpringApplication.run(IoCDemo1Application.class, args);

        UserController controller = context.getBean(UserController.class);
        controller.doController();

        UserService userService1=context.getBean(UserService.class);
        userService1.doService();

        UserRepository repository = context.getBean(UserRepository.class);
        repository.doRepository();

        UserComponent component = context.getBean(UserComponent.class);
        component.doComponent();

        UserConfig config = context.getBean(UserConfig.class);
        config.doConfig();

    }
}

控制台输出如下:

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

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

相关文章

VLAN 基础 | 不同 VLAN 间通信实验

注:本文为 “ Vlan 间通信” 相关文章合辑。 英文引文,机翻未校。 图片清晰度限于原文图源状态。 未整理去重。 How to Establish Communications between VLANs? 如何在 VLAN 之间建立通信? Posted on November 20, 2015 by RouterSwi…

GRE阅读双线阅读 --青山学堂GRE全程班 包括 阅读、数学、写作、填空、背单词

新版GRE考试整体结构 section题量时间写作1篇issue30min语文S112道题(7道填空5道阅读)18min数学S112道题21min语文S215道题(7道填空8道阅读)23min数学S215道题26min Tips: 写作结束后,语文和数学的顺序不固定,2中可能: issue -> V ->…

5.5.1 面向对象的基本概念

文章目录 基本概念面向对象的5个原则 基本概念 面向对象的方法,特点时其分析与设计无明显界限。虽然在软件开发过程中,用户的需求会经常变化,但客观世界对象间的关系是相对稳定的。对象是基本的运行实体,由数据、操作、对象名组成…

Java_类加载器

小程一言类加载器的基础双亲委派模型核心思想优势 各类加载器的职责 类加载器的工作流程举例:如何在Java中使用类加载器启动类加载器、扩展类加载器与系统类加载器输出解释自定义类加载器 类加载器与类冲突总结 小程一言 本专栏是对Java知识点的总结。在学习Java的过…

开源音乐管理软件Melody

本文软件由网友 heqiusheng 推荐。不过好像已经是一年前了 😂 简介 什么是 Melody ? Melody 是你的音乐精灵,旨在帮助你更好地管理音乐。目前的主要能力是帮助你将喜欢的歌曲或者音频上传到音乐平台的云盘。 主要功能包括: 歌曲…

一、TensorFlow的建模流程

1. 数据准备与预处理: 加载数据:使用内置数据集或自定义数据。 预处理:归一化、调整维度、数据增强。 划分数据集:训练集、验证集、测试集。 转换为Dataset对象:利用tf.data优化数据流水线。 import tensorflow a…

分析哲学:从 语言解剖到 思想澄清的哲学探险

分析哲学:从 语言解剖 到 思想澄清 的哲学探险 第一节:分析哲学的基本概念与公式解释 【通俗讲解,打比方来讲解!】 分析哲学,就像一位 “语言侦探”,专注于 “解剖语言”,揭示我们日常使用的语…

鸿蒙物流项目之基础结构

目录: 1、项目结构2、三种包的区别和使用场景3、静态资源的导入4、颜色样式设置5、修改项目名称和图标6、静态包基础目录7、组件的抽离8、在功能模块包里面引用静态资源包的组件 1、项目结构 2、三种包的区别和使用场景 3、静态资源的导入 放在har包中,那…

[漏洞篇]SQL注入漏洞详解

[漏洞篇]SQL注入漏洞详解 介绍 把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。通过构造恶意的输入,使数据库执行恶意命令,造成数据泄露或者修改内容等,以达到攻击的目的。…

【最后203篇系列】006 -使用ollama运行deepseek-r1前后端搭建

说明 这块已经不算新内容了,年前搭完了后端(ollama),本来想早点分享的,但是当时的openwebui有点不给力,有些地方不适配,然后配置项找不到。所以前端没搭好,也就不完整:只能通过命令…

JDK-1.8.0_432安装(CentOS7)

目录 1、卸载系统自带JDK 2、下载安装包并解压 3、赋予可执行权限 4、设置环境变量 5、刷新环境变量 6、查看JDK版本 1、卸载系统自带JDK # 查询出自带的jdk rpm -qa | grep jdk rpm -qa | grep java # 将上述命令列出的包依次删除 rpm -e --nodeps xxxxxxx 2、下载…

【Linux】24.进程信号(1)

文章目录 1. 信号入门1.1 进程与信号的相关知识1.2 技术应用角度的信号1.3 注意1.4 信号概念1.5 信号处理常见方式概览 2. 产生信号2.1 通过终端按键产生信号2.2 调用系统函数向进程发信号2.3 由软件条件产生信号2.4 硬件异常产生信号2.5 信号保存 3. 阻塞信号3.1 信号其他相关…

股票入门知识

股票入门(更适合中国宝宝体制) 股市基础知识 本文介绍了股票的基础知识,股票的分类,各板块发行上市条件,股票代码,交易时间,交易规则,炒股术语,影响股价的因素&#xf…

用Python实现K均值聚类算法

在数据挖掘和机器学习领域,聚类是一种常见的无监督学习方法,用于将数据点划分为不同的组或簇。K均值聚类算法是其中一种简单而有效的聚类算法。今天,我将通过一个具体的Python代码示例,向大家展示如何实现K均值聚类算法&#xff0…

Flask代码审计实战

文章目录 Flask代码审计SQL注入命令/代码执行反序列化文件操作XXESSRFXSS其他 审计实战后记reference Flask代码审计 SQL注入 1、正确的使用直白一点就是:使用”逗号”,而不是”百分号” stmt "SELECT * FROM table WHERE id?" connectio…

Unity 2D实战小游戏开发跳跳鸟 - 跳跳鸟碰撞障碍物逻辑

在有了之前创建的可移动障碍物之后,就可以开始进行跳跳鸟碰撞到障碍物后死亡的逻辑,死亡后会产生一个对应的效果。 跳跳鸟碰撞逻辑 创建Obstacle Tag 首先跳跳鸟在碰撞到障碍物时,我们需要判定碰撞到的是障碍物,可以给障碍物的Prefab预制体添加一个Tag为Obstacle,添加步…

【玩转 Postman 接口测试与开发2_015】第12章:模拟服务器(Mock servers)在 Postman 中的创建与用法(含完整实测效果图)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十二章 模拟服务器(Mock servers)在 Postman 中的创建与用法1 模拟服务器的概念2 模拟服务器的创建2.1 开启侧边栏2.2 模拟服务器的两种创建方式2.3 私有模拟器的 API 秘钥的用法…

mysql操作语句与事务

数据库设计范式 数据库设计的三大范式 ‌第一范式(1NF)‌:要求数据库表的每一列都是不可分割的原子数据项,即列中的每个值都应该是单一的、不可分割的实体。例如,如果一个表中的“地址”列包含了省、市、区等多个信息…

基于SpringBoot电脑组装系统平台系统功能实现五

一、前言介绍: 1.1 项目摘要 随着科技的进步,计算机硬件技术日新月异,包括处理器(CPU)、主板、内存、显卡等关键部件的性能不断提升,为电脑组装提供了更多的选择和可能性。不同的硬件组合可以构建出不同类…

【智力测试——二分、前缀和、乘法逆元、组合计数】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int mod 1e9 7; const int N 1e5 10; int r[N], c[N], f[2 * N]; int nr[N], nc[N], nn, nm; int cntr[N], cntc[N]; int n, m, t;void init(int n) {f[0] f[1] 1;for (int i …