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求职面试:电商商品推荐系统中的AI技术应用
java·缓存·kafka·推荐系统·向量数据库·jvm调优·spring ai
浩~~16 分钟前
HTML5 浮动(Float)详解
前端·html·html5
@ chen22 分钟前
常见排序算法及其java实现
java·算法·排序算法
为自己_带盐23 分钟前
浅聊一下数据库的索引优化
开发语言·数据库·php
gb42152871 小时前
mysql数据库中某个数据表的碎片率自己降低了,mysql数据表对碎片率有自动优化机制吗?
数据库·mysql
带刺的坐椅1 小时前
SpringBoot2 可以使用 SolonMCP 开发 MCP(江湖救急)
java·spring·ai·solon·mcp
shengjk11 小时前
序列化和反序列化:从理论到实践的全方位指南
java·大数据·开发语言·人工智能·后端·ai编程
AI大模型顾潇1 小时前
[特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)
前端·数据库·人工智能·语言模型·自然语言处理·prompt·neo4j
有时间要学习1 小时前
MySQL——数据类型&&表的约束
数据库·mysql
jimsten1 小时前
苍穹外卖 - Day02 学习笔记
java·笔记·学习