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

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

时间2025-05-05 00:03:58分类IT科技浏览3481
导读: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
菜鸟教程js教程(【笔记】【JavaScript】【jQuery】菜鸟编程学习笔记)