Bean的管理

1.主动获取Bean

spring项目在需要时,会自动从IOC容器中获取需要的Bean

我们也可以自己主动的得到Bean对象

(1)获取bean对象,首先获取SpringIOC对象

private ApplicationContext applicationContext //IOC容器对象

(2 )方法1:根据名称获取bean

创建bean对象,没有指定名称时,默认就是 bean的名称 就是 类名的首字母小写

直接获取得到的是Object对象,需要强转

三次运行都只得到一个Bean,说明Bean对象默认是单例的



2.bean的作用域:(知道这两种就行了)

单例的:容器内只有一个单例的Bean

非单例的:每次使用都创建新的bean

下面三种只在web环境中才有,不重要

可以通过@Lazy来延迟加载bean,只有第一次使用时,才会初始化这个bean。(使用不多)



3.第三方bean的配置

我们声明自己的bean对象是用这几个注解,自己的bean对象就是自己写的类,将自己的bean对象交给IOC容器管理,加上这几个注解及其衍生注解

场景:

dem4j是用来解析xml文件的,

我们想要用的话,第一步,先在pom中加入这个dom4j这个依赖

第二步,可以在类中new一个SAXReader对象,然后调用方法就可以使用了

但是我们都是用Spring框架了,这样使用太麻烦了,我们可以把SAXReader交给IOC容器去管理,每次用的时候,直接注入就好了。但是发现SAXReader类并没有加上@component注解生成bean对象,且是只读文件,我们也加不了

所以,我们使用第三方的bean对象,就不能像之前的做法,直接在类上加@component注解生成bean对象了

解决方法:使用第三方的bean

在启动类上加上一个方法(方法名就是第三方类交给IOC管理的bean对象的bean的默认名称),方法返回值(这个类的对象)交给IOC容器管理,成为bean对象。

这个方法必须加上@Bean注解

这样,在其他地方使用这个对象,使用@Autowired注入进来就可以了

和main方法是平行的

但是呢?如果都加到启动类中,启动类就变复杂了,要保证启动类的纯洁,不建议加在启动类中写多余的代码

我们建议在配置类(@Configration)中声明这样一个类,集中管理第三方的bean注入。

在配置类上加上一个方法(方法名是随意的),方法返回值(这个类的对象)交给IOC容器管理,成为bean对象。如果有多个第三方的bean,再定义一个方法,重复这个过程,就可以了

验证:方法名就是 IOC容器中bean的名称

测试:通过主动获取bean对象方法,通过bean的名称获取bean对象,看看能不能获取到?

获取到了,说明 方法名就是 IOC容器中bean的名称



注入第三方bean的时候,如何解决依赖注入的问题?写到形参里就可以了

场景:如果我们在注入第三方bean(SAXReader)的时候,SAXReader还依赖DeptService的bean,怎么办?

只需要把DeptService放到形参的位置,spring就会自动注入DeptService的bean以帮助我们注入第三方bean(SAXReader)

不需要@Autowired手动装配

总结:

(1)如果是自己定义的类,想交给IOC容器管理,就是用@Component注解及其衍生注解

(2)如果是引入第三方的类,想交给IOC容器管理,,并且源码中没有加@Component注解,源码文件又只读不可写,我们也加不了,就要使用@Bean注解,放到配置类中,交给IOC容器管理

相关推荐
☆致夏☆3 分钟前
Java-反射
java·开发语言
鸽鸽程序猿7 分钟前
【数据结构】顺序表
java·开发语言·数据结构·学习·算法·intellij idea
邂逅岁月12 分钟前
珍藏多年的计算机内核结构大全笔记,掌握计算机工作原理真不难
java·开发语言·windows·笔记·系统架构·计算机外设·计算机硬件
过去式的美好14 分钟前
vue前端通过sessionStorage缓存字典
前端·vue.js·缓存
skyshandianxia18 分钟前
Java面试八股之MySQL中binlog的工作模式有哪些
java·开发语言·面试
十一月十一」20 分钟前
Spring Cloud: OpenFeign 超时重试机制
java·spring cloud·微服务
硕风和炜29 分钟前
【LeetCode:3033. 修改矩阵 + 模拟】
java·算法·leetcode·矩阵·模拟
kaixin_learn_qt_ing34 分钟前
解析Xml文件并修改QDomDocument的值
xml·数据库·qt
Simaoya35 分钟前
vue判断元素滚动到底部后加载更多
前端·javascript·vue.js
头顶一只喵喵37 分钟前
Vue基础知识:Vue3.3出现的defineOptions,如何使用,解决了什么问题?
前端·javascript·vue.js·vue3