最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Spring IOC官方文档学习笔记(二)之Bean概述

来源:博客园


【资料图】

1.Bean概述

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

属性说明
Class全限定类名
Namebean的名称
Scopebean的作用域
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中的BeanFactoryConfigurableListableBeanFactory 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属性可不唯一,多个别名之间用分号,逗号或空格分隔开,如下所示:

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

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

             

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");        }    }}                //使用ApplicationContext ctx = new ClassPathXmlApplicationContext("boke/from.xml");//获取已注册到容器中的静态内部类Outer.Inner inner = (Outer.Inner) ctx.getBean("inner");inner.doSomething();

关键词: 静态内部类 文件配置 创建对象