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容器管理

相关推荐
Asort13 分钟前
JavaScript 从零开始(六):控制流语句详解——让代码拥有决策与重复能力
前端·javascript
无双_Joney32 分钟前
[更新迭代 - 1] Nestjs 在24年底更新了啥?(功能篇)
前端·后端·nestjs
在云端易逍遥33 分钟前
前端必学的 CSS Grid 布局体系
前端·css
ccnocare35 分钟前
选择文件夹路径
前端
艾小码35 分钟前
还在被超长列表卡到崩溃?3招搞定虚拟滚动,性能直接起飞!
前端·javascript·react.js
闰五月36 分钟前
JavaScript作用域与作用域链详解
前端·面试
泉城老铁39 分钟前
idea 优化卡顿
前端·后端·敏捷开发
前端康师傅39 分钟前
JavaScript 作用域常见问题及解决方案
前端·javascript
司宸41 分钟前
Prompt结构化输出:从入门到精通的系统指南
前端