什么是spring beans(Spring IOC官方文档学习笔记(二)之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版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!