【Spring】使用@Bean和@Import注解配置Bean,与Bean的实例化

目录

1、bean是什么

2、配置bean

2.1、使用@Bean注解配置Bean

2.2、使用@Import注解配置Bean

 3、实例化Bean

1、bean是什么

        在 Spring 中,Bean 是指由 Spring 容器管理的对象。Spring IOC 容器负责创建、配置和管理这些 Bean 对象的生命周期。Spring IOC 容器会管理应用程序中的组件,并通过依赖注入(DI)将它们组装在一起。Bean 是应用程序的核心构建块,它们通常代表应用程序中的各种对象,例如服务、数据访问对象(DAO)、控制器等。

        要在 Spring 中使用 Bean,通常需要在 Spring 配置文件(如 XML 文件)或使用注解(@Component)来声明 Bean,并告诉 Spring 容器如何创建和配置它们。一旦 Bean 被声明和配置好,Spring 容器将负责实例化它们,并在需要时将它们注入到其他 Bean 中。

        简单来说就是:在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 bean。bean 是由Spring IoC 容器实例化、组装和管理的对象。

 

2、配置bean

        配置bean可以通过在 xml 文件中用 <bean class=""> 这个标签的方式来进行显式的声明,但是这种方式太麻烦了。

        所以现在都是通过 @component注解 来把类配置成bean,在类级别上使用 @Component 注解或其派生注解(@Service、@Repository、@Controller 等)就可以将一个类声明为 Bean

        这两种配置方式可以看这一篇:【Spring】分别基于XML、注解和配置类实现Spring的IOC(控制反转)-CSDN博客

这里主要是使用@Bean和@Import注解配置Bean

2.1、使用@Bean注解配置Bean

@Bean 特性:

一、是放在方法上面的

二、必须放在配置类里面

        @Bean方法调用另外一个@Bean方法,会从spring容器中去获取

三、@Bean可以干预bean的实例化过程的,而且jar包中的类如果要配置bean就需要用@Bean

四、在这个方法中声明的参数,spring也会帮我们自动注入进来

相关代码:

//接口IUserDao
public interface IUserDao {//执行查询用户void getUser();
}//接口IUserDao的实现类UserDao
public class UserDao implements IUserDao {@Override//执行查询用户public void getUser() {System.out.println("Holle Spring");}
}//接口IUserService
public interface IUserService {void getUser();
}//接口IUserService的实现类UserService
//@Service
public class UserService implements IUserService {@AutowiredIUserDao userDao;@Overridepublic void getUser() {userDao.getUser();}
}//配置类SpringConfig
@Configuration
public class SpringConfig {@Bean  //使用@Bean配置UserService成为beanpublic IUserService userService(){IUserDao userDao = UserDao();UserService userService = new UserService();return userService;}@Bean  //使用@Bean配置UserDao成为beanpublic IUserDao UserDao(){return new UserDao();}
}//测试类C3IocApplicationTests
@SpringBootTest
class C3IocApplicationTests {@AutowiredIUserService userService;@Testvoid contextLoads() {userService.getUser();}
}

2.2、使用@Import注解配置Bean

@lmport 特性:

一、@lmport必须写在类上面,不能用于方法等其他的上面

二、标记的类必须是一个bean,否则不会起作用

 @lmport的三种使用方式

(1)普通类:就是直接@lmport(UserService.class)普通类,就会把这个普通类注入spring

示例:

(2)lmportSelector :用于根据完整限定名字符串批量注入Bean

        a、定义一个类实现lmportSelector

        b、批量注册bean(通过实现selectlmports,返回bean的完整类路径字符串数组)

        c、然后在配置类上加上@lmport(实现lmportSelector.class)

示例:

 

其他代码和上面使用@Bean的例子是一样的,实现了 ImportSelector 接口的 MyImportSelector 类代码:

public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[]{"com.lt.ioc.service.UserService","com.lt.ioc.dao.UserDao"};}
}

(3)ImportBeanDefinitionRegistrar

        定义一个类实现lmportBeanDefinitionRegistrar,然后在方法里根据beanDefinition注册bean

示例:和上面的 lmportSelector 用法一样,把实现了 ImportBeanDefinitionRegistrar 接口的类传递给@Import注解就可以

实现了 ImportBeanDefinitionRegistrar 接口的 MyImportBeanDefinitionRegistrar 类代码:

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {//创建BeanDefinition,只有这个类的BeanDefinition存在了,才能根据这个BeanDefinition去创建类的bean对象RootBeanDefinition definition = new RootBeanDefinition();//把要创建bean的类的完整限定名传递给BeanDefinitiondefinition.setBeanClassName("com.lt.ioc.service.UserService");//注册这个BeanDefinitionregistry.registerBeanDefinition("userService",definition);}
}

 3、实例化Bean

1、spring会默认使用无参构造器(无参构造函数)实例化

  • 有多个构造函数依然会调用无参构造函数
  • 如果只有一个有参构造函数,spring就会调用这个有参构造函数,并且把参数自动装配进来
  • 如果有参构造函数有个多个,并且没有无参构造函数,那就会报错,因为spring不知道该选哪一个构造函数,这时候对spring来说,他需要一个默认的无参构造函数

2、使用实例工厂方法实例化--@Bean

  • 可以自由的选择构造函数进行实例化

 

3、使用工厂Bean。实例化--FactoryBean

  • FactoryBean是一个接口
  • 需要有一个Bean,一旦这个Bean实现FaétoryBean就成为了特殊的Bean
  • 需要实现2个方法

        1)getObject() ---->当通过Bean实际名称获取到的就是getObject 返回的对象(伪装)

        2)getObjecType()---->想通过容器去获取对应(getObject 返回的对象)的类型,就需要返回getObject 返回的对象的类型

  • 可以自由的选择构造函数进行实例化

示例:

OrderService类是加了@Service注解并且实现了FactoryBean接口的一个类,代码:

@Service
public class OrderService implements FactoryBean {// 加了@Service注解并且实现了FactoryBean接口的OrderService变成了一个特殊的bean// 特殊: 就是根据bean(这里是OrderService)的名字实际上是获取getObject方法返回的对象(狸猫换太子)@Overridepublic Object getObject() throws Exception {//(这里getObject方法中返回的对象就是UserService)return new UserService();}@Overridepublic Class<?> getObjectType() {//想通过容器去获取对应(getObject 返回的对象)的类型,就需要返回getObject返回的对象的类型return UserService.class;}
}

获取容器,并分别通过FactoryBean接口中的两种方法从容器中获取UserService的bean和获取实现了FactoryBean接口的OrderService实际的Bean

//启动类C3IocApplication
@SpringBootApplication
public class IocApplication {public static void main(String[] args) {ConfigurableApplicationContext ioc = SpringApplication.run(IocApplication.class, args);//OrderService是加了@Service注解并且实现了FactoryBean接口的一个类,他是一个特殊的beanSystem.out.println(ioc.getBean("orderService"));//通过OrderService中重写了的getObject()方法来获取UserService的beanSystem.out.println(ioc.getBean(UserService.class));//通过OrderService中重写了的getObjectType()方法来获取UserService的bean//如果想获取FactoryBean实际的Bean可以 1.通过类型; 2.在beanName前加上&System.out.println(ioc.getBean(OrderService.class));System.out.println(ioc.getBean("&orderService"));}}

推荐: 

【Spring】分别基于XML、注解和配置类实现Spring的IOC(控制反转)-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137237805?spm=1001.2014.3001.5501

 【java多线程】通过等待唤醒机制、局部变量、原子变量实现线程同步-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137122461?spm=1001.2014.3001.5501

【java多线程】通过等待唤醒机制、局部变量、原子变量实现线程同步-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/m0_65277261/article/details/137122461?spm=1001.2014.3001.5501

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

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

相关文章

链表之单链表

上一篇博客我们学习了线性表中的顺序表&#xff0c;这一篇博客让我们继续往下了解线性表的链表&#xff0c;链表分为好几种结构&#xff0c;活不多说&#xff0c;让我们开始学习吧&#xff01; 目录 1.链表 2.链表的结构 3.单链表的实现 1.链表 1.概念&#xff1a;它是一种物…

Folder Icons for Mac v1.8 激活版文件夹个性化图标修改软件

Folder Icons for Mac是一款Mac OS平台上的文件夹图标修改软件&#xff0c;同时也是一款非常有意思的系统美化软件。这款软件的主要功能是可以将Mac的默认文件夹图标更改为非常漂亮有趣的个性化图标。 软件下载&#xff1a;Folder Icons for Mac v1.8 激活版 以下是这款软件的一…

【2024系统架构设计】案例分析- 5 Web应用

目录 一 基础知识 二 真题 一 基础知识 1 Web应用技术分类 大型网站系统架构的演化:高性能、高可用、可维护、应变、安全。 从架构来看:MVC,MVP,MVVM,REST,Webservice,微服务。

Spark-Scala语言实战(11)

在之前的文章中&#xff0c;我们学习了如何在spark中使用RDD中的cartesian,subtract最终两种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scal…

数据结构进阶篇 之 【交换排序】(冒泡排序,快速排序递归、非递归实现)

当你觉的自己不行时&#xff0c;你就走到斑马线上&#xff0c;这样你就会成为一个行人 一、交换排序 1.冒泡排序 BubbleSort 1.1 基本思想 1.2 实现原理 1.3 代码实现 1.4 冒泡排序的特性总结 2.快速排序 QuickSort 2.1 基本思想 2.2 递归实现 2.2.1 hoare版 2.2.2 …

【JAVASE】面向对象程序三大特性之一( 封装)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609;\n &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1.包的使用 2.static关键字的使用 3.代码…

苹果手表Apple Watch录了两个半小时的录音,却只能播放4秒,同步到手机也一样,还能修复好吗?

好多人遇到这个情况&#xff0c;用苹果手表Apple Watch录音&#xff0c;有的录1个多小时&#xff0c;有的录了3、4小时&#xff0c;甚至更长时间&#xff0c;因为手表没电&#xff0c;忘记保存等原因造成录音损坏&#xff0c;都是只能播放4秒&#xff0c;同步到手机也一样&…

游戏引擎中的物理应用

一、 角色控制器 Character Controller和普通的动态对象&#xff08;Dynamic Actor &#xff09;是不同的&#xff0c;主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力&#xff08;可以站停在位置上&#xff09;&#xff0c;没有弹性加速和刹车几乎立即…

【Django学习笔记(三)】BootStrap介绍

BootStrap介绍 前言正文1、BootStrap 快速了解2、初识BootStrap2.1 下载地址2.2 创建目录2.3 引入BootStrap2.4 使用BootStrap 3、BootStrap 组件&样式3.1 导航条3.2 栅格系统3.3 container3.3.1 container3.3.2 container-fluid 3.4 面板3.5 媒体对象3.6 分页3.7 图标3.7.…

外卖配送时间预测项目

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 项目背景 外卖服务的兴起: 随着互联网技术和移动应用的发展&#xff0c;外卖成为一种日益普及的餐饮服务方式。顾客通过餐厅、杂货店的网站或移…

Qt中继承QCheckBox的类结合QTableWidget实现多选并且每个多选的id都不一样

1.相关描述 继承QCheckBox的类MyCheckBox&#xff0c;利用QTableWidget的setCellWidget方式添加MyCheckBox类的对象 2.相关页面 3.相关代码 mycheckbox.h #ifndef MYCHECKBOX_H #define MYCHECKBOX_H#include <QCheckBox> #include <QObject>class MyCheckBox : pu…

计算机网络:数据链路层 - 封装成帧 透明传输 差错检测

计算机网络&#xff1a;数据链路层 - 封装成帧 & 透明传输 & 差错检测 数据链路层概述封装成帧透明传输差错检测 数据链路层概述 从数据链路层来看&#xff0c;主机 H1 到 H2 的通信可以看成是在四段不同的链路上的通信组成的&#xff0c;所谓链路就是从一个节点到相邻…

从0到1构建uniapp应用-store状态管理

背景 在 UniApp的开发中&#xff0c;状态管理的目标是确保应用数据的一致性&#xff0c;提升用户体验&#xff0c;并简化开发者的工作流程。通过合理的状态管理&#xff0c;可以有效地处理用户交互、数据同步和界面更新等问题。 此文主要用store来管理用户的登陆信息。 重要…

数据结构——图的应用(最小生成树,最短路径,拓扑排序,关键路径)

目录 1.最小生成树 1.概念回顾——生成树 2.最小生成树概念 2.构造最小生成树 1.MST性质 2.Prim算法 3.Kruskal 算法 4.两种算法比较 3.最短路径 1.两点间最短路径 2.某源点到其它各点最短路径 3.单源最短路径——用Dijkstra算法 4.所有顶点间的最短路径…

QML嵌套页面的实现学习记录

StackView是一个QML组件&#xff0c;用于管理和显示多个页面。它提供了向前和向后导航的功能&#xff0c;可以在堆栈中推入新页面&#xff0c;并在不需要时将页面弹出。 ApplicationWindow {id:rootvisible: truewidth: 340height: 480title: qsTr("Stack")// 抽屉:…

【GlobalMapper精品教程】073:像素到点(Pixels-to-Points)从无人机图像轻松生成点云

文章目录 一、工具介绍二、生成点云三、生成正射四、生成3D模型五、注意事项一、工具介绍 Global Mapper v19引入的新的像素到点工具使用摄影测量原理,从重叠图像生成高密度点云、正射影像及三维模型。它使LiDAR模块成为已经功能很强大的的必备Global Mapper扩展功能。 打开…

Linux的中间件

我们先补充点关于awk的内容 awk的用法其实很广。 $0 表示整条记录 变量&#xff1a; NF 一行中有多少个字段&#xff08;表示字段数&#xff09; NR &#xff1a; 代表当前记录的序号&#xff0c;从1开始计数。每读取一条记录&#xff0c;NR的值就会自动增加1。&#xff08;…

编程生活day6--回文子串、蛇形填充数组、笨小猴、单词排序

回文子串 题目描述 给定一个字符串&#xff0c;输出所有长度至少为2的回文子串。 回文子串即从左往右输出和从右往左输出结果是一样的字符串&#xff0c;比如&#xff1a;abba&#xff0c;cccdeedccc都是回文字符串。 输入 一个字符串&#xff0c;由字母或数字组成。长度5…

【设计原则】CQRS

文章目录 概述组成与特点优缺点何时使用 CQRS 模式推荐阅读 概述 CQRS&#xff08;Command Query Responsibility Segregation&#xff09;是一种软件设计模式&#xff0c;其核心设计理念是将一个对象的数据访问&#xff08;查询&#xff09;和数据操作&#xff08;命令&#…

显示器and拓展坞PD底层协商

简介&#xff1a; PD显示器或者PD拓展坞方案中&#xff0c;连接显示设备的Type-C端口主要运行在DRP模式&#xff0c;在此模式下可以兼容Source&#xff08;显卡&#xff09;、Sink&#xff08;信号器&#xff09;、DRP&#xff08;手机、电脑&#xff09;模式的显示设备。 Sou…