首页IT科技什么是spring beans(Spring IOC官方文档学习笔记(二)之Bean概述)

什么是spring beans(Spring IOC官方文档学习笔记(二)之Bean概述)

时间2025-08-05 04:07:20分类IT科技浏览4861
导读:1.Bean概述...

1.Bean概述

(1) Spring IoC容器管理一个或多个bean              ,这些bean是根据我们所提供的配置元数据来创建的                    ,在容器内部       ,BeanDefinition对象就代表了bean的配置元数据              ,它主要包含了如下几个方面的内容:

属性 说明 Class 全限定类名 Name bean的名称 Scope bean的作用域 Constructor arguments 构造函数参数 Properties 成员变量属性值 Autowiring Mode 自动装配模式 Lazy initialization mode 懒加载模式 Initialization Method 初始化回调 Destruction Method 销毁回调

(2) 一般情况下                    ,Spring中的bean来自于Spring的自动扫描解析       ,除此之外       ,Spring还允许我们手动的向容器中注册一些额外的对象                    ,如下所示:

ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("boke/definition.xml"); //1.获取ApplicationContext中的BeanFactory ConfigurableListableBeanFactory beanFactory = ctx.getBeanFactory(); Man man = new Man(); //2.通过beanFactory的registerSingleton方法向容器中注册容器外的额外对象 beanFactory.registerSingleton("man", man); //3.注册之后,便可获取使用该对象 Man existMan = beanFactory.getBean("man", Man.class); existMan.doSomething();

总结一下              ,向Spring IOC容器中注册额外对象       ,大致可分为两步:

第一步:通过调用ApplicationContext实现类们的getBeanFactory()方法拿到DefaultListableBeanFactory

第二步:调用DefaultListableBeanFactory中的registerSingleton()方法或registerBeanDefinition()来向容器中注册额外对象

注意:在实践上由我们手动注册的bean需要尽早向容器中注册                    ,如果注册的太晚              ,就无法和Spring所提供的一些步骤结合,会导致一些依赖注入失败

2.命名Bean

(1) Spring中的bean通常有一个唯一的id和多个别名                    ,在基于xml的配置中                    ,可通过bean标签中的id属性和name属性来标识一个bean的id和别名,其中id属性必须唯一              ,而name属性可不唯一                    ,多个别名之间用分号       ,逗号或空格分隔开              ,如下所示:

<!-- xml文件内容 --> <beans ...> <!-- 定义了一个bean                    ,它的id为man       ,别名为thisMan       ,yesMan --> <bean class="cn.example.spring.boke.Man" id="man" name="thisMan,yesMan"> </bean> </beans> //Java代码: ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/from.xml"); //打印下面这三个Man对象的地址                    ,发现它们的地址相同              ,为同一对象 Man man = (Man) ctx.getBean("man"), thisMan = (Man) ctx.getBean("thisMan"), yesMan = (Man) ctx.getBean("yesMan");

(2) 在基于Java code的配置中       ,如使用@Bean                    ,@Component等注解时              ,id或name属性不是必须提供的,如果都没有                    ,Spring容器会默认提供一个唯一的id(生成规则:通常情况下会按照驼峰命名法取类名并将其首字母小写                    ,但如果类名的第一,二个字符都是大写时              ,会保留原始大小写)                    ,如下所示

//例子一:定义一个bean       ,未声明它的id或name              ,此时Spring会自动帮我们生成一个唯一的id                    ,为exampleA @Component public class ExampleA { public void doSomething() { System.out.println("Hello This is ExampleA"); } } //从Spring IOC中获取上面这个bean AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext("cn.example.spring"); //使用exampleA这个id来寻找容器中ExampleA对象 ExampleA exampleA = (ExampleA) ctx.getBean("exampleA"); exampleA.doSomething(); //例子二:定义了一个bean       ,未声明它的id或name       ,且该类名的第一                    ,二个字符都是大写              ,此时Spring为其生成的id为IMyService       ,与类名相同 @Component public class IMyService { } //验证过程省略...

(3) 还可以使用alias标签来定义一个bean的别名                    ,如下

<beans ...> <bean class="cn.example.spring.boke.ExampleA" id="exampleA"> </bean> <!-- 此时              ,既可以用exampleA来获取到这个bean,也可以用aliasA来获取这个bean                    ,它俩是等价的 --> <alias name="exampleA" alias="aliasA"></alias> </beans>

3.实例化bean

(1) BeanDefinition在本质上就是bean的‘配方表’                    ,容器会根据BeanDefinition中的配置信息来创建出所需要的对象供我们使用,在基于xml的配置中              ,通过bean标签中的class属性来指定要创建对象的类类型                    ,这个bean标签中的class属性对应于BeanDefanition里的Class属性

(2) 通过美元符号($)或点符号(.)来注册静态内部类       ,如下

public class Outer { //注意:这里是‘静态‘内部类 public static class Inner { public void doSomething() { System.out.println("Here is inner"); } } } <!-- xml文件配置 --> <beans ...> <!-- 使用$调用静态内部类 --> <bean class="cn.example.spring.boke.Outer$Inner" id="inner"></bean> <!-- 使用.调用静态内部类              ,与上面的等价 --> <!-- <bean class="cn.example.spring.boke.Outer.Inner" id="inner"></bean> --> </beans> //使用 ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/from.xml"); //获取已注册到容器中的静态内部类 Outer.Inner inner = (Outer.Inner) ctx.getBean("inner"); inner.doSomething();

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
控制根据时机有哪些类型(ahooks 中那些控制“时机”的hook都是怎么实现的?)