Spring学习三:Bean与配置元数据
来源:互联网 发布:先锋电视网络看电视 编辑:程序博客网 时间:2024/06/15 01:21
学习目标
- 知道配置元数据的概念
- 基于xml的配置元数据的使用
- xml配置文件中bean标签的各个定义与使用
- Bean后置处理器的用法:实现BeanPostProcessor接口
- xml配置文件中定义Bean的继承
概述
之前学习了Spring的IoC容器,这个容器容的就是Java Bean。所以,需要对Java Bean进行学习。
Bean的定义
在Java中一个类每个属性都具有set和get方法,就认为这个Java对象是个Bean。
而在一个项目中,有那么多的类,是如何知道Bean的呢?这就需要引入Spring的配置元数据概念:向Spring容器提供相关信息,以便实例化Bean,并指定如何对这些Bean进行装配。所提供的信息称为配置元数据(configuration metadata)。
Spring支持三种格式的配置元数据:
- 基于Java
- 基于注解(annotation)
- 基于XML
这篇笔记只讲基于XML的配置元数据。即,xml格式的配置文件。
配置文件中的bean标签具有以下属性:
举例如下:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- 最简单的定义,id和class都不可少 --> <bean id="..." class="..."> <!-- bean内部的属性(比如设值注入等) --> </bean> <!-- bean的懒加载模式 --> <bean id="..." class="..." lazy-init="true"> <!-- 内部属性,没有可以不在这里填东西 --> </bean> <!-- 指定默认初始化方法的bean,在初始化这个bean之前,会先执行这个bean类中init-method指定的方法。(如果这里init-method指定了,但实际的类中没有指定的方法,会报错) --> <bean id="..." class="..." init-method="..."> </bean> <!-- 指定bean销毁时要做的事,在bean的声明周期最后,会执行这个bean类中destroy-method指定的方法,bean类中没有的话也会报错 --> <bean id="..." class="..." destroy-method="..."> </bean></beans>
Bean的作用域
在Bean的定义中,有个scope属性,这个属性表示这个Bean对象的作用域。
Spring支持5中作用域,分别如下:
所用于singleton和prototype对所有Bean对象均使用,后面3者只对Web应用有效。
练习路径为:https://github.com/wayss000/learnSpring/tree/master/SpringBean
Bean生命周期
理解 Spring bean 的生命周期需要知道,当一个 bean 被实例化时,它可能需要执行一些初始化使它转换成可用状态。同样,当 bean 不再需要,并且从容器中移除时,可能需要做一些清除工作。
这里注意xml配置Bean时,init-method
和 destroy-method
属性,它们分别表示在Bean初始化时和销毁Bean时需要做的事。
同时这俩也对应两个注解@PostConstruct
和@PreDestroy
Bean的后置处理器
实现BeanPostProcessor接口提供的方法,然后就可以配置和初始化一个bean之后实现一些自定义逻辑回调方法了。
可以配置多个BeanPostProcessor接口。
ApplicationContext 会自动检测由 BeanPostProcessor 接口的实现定义的 bean,注册这些 bean 为后置处理器,然后通过在容器中创建 bean,在适当的时候调用它。
练习地址:https://github.com/wayss000/learnSpring/tree/master/SpringBean/src/main/java/pers/wayss/springBean/postProcessor
InitHelloPostProcessor类实现了BeanPostProcessor接口中的两个方法,分别是:
postProcessBeforeInitialization()该方法在注入的Bean的init方法执行前执行postProcessAfterInitialization()该方法在注入的Bean的init方法执行后执行
Bean的继承
Java中用extends可以实现继承,在Spring的Bean中也有继承,并且这个继承和Java中的继承是不一样的。
下面是一个Bean继承模板的实例(摘自极客学院)
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <!-- Bean的抽象模板,不能被实例化 --> <bean id="beanTeamplate" abstract="true"> <property name="message1" value="Hello World!"/> <property name="message2" value="Hello Second World!"/> <property name="message3" value="Namaste India!"/> </bean> <!-- helloIndia继承了beanTeamplate中的property配置,并实现了message1和message3的配置 --> <bean id="helloIndia" class="com.tutorialspoint.HelloIndia" parent="beanTeamplate"> <property name="message1" value="Hello India!"/> <property name="message3" value="Namaste India!"/> </bean></beans>
Demo地址:https://github.com/wayss000/learnSpring/tree/master/SpringBean/src/main/java/pers/wayss/springBean/inheritance
总结
这部分主要需要知道以及5个概念和使用:
1. 知道配置元数据的概念,即,Bean初始化时所需要的配置参数,常用的3中配置元数据的方法:基于Java、基于注解、基于xml(常用)。
2. 基于xml的配置元数据的使用,用ApplicationContext类来获取xml中设置的Bean初始化信息。
3. xml配置文件中bean标签的各个定义与使用,需要记住相关单词。
4. Bean后置处理器的用法:实现BeanPostProcessor接口,知道
postProcessAfterInitialization()和postProcessBeforeInitialization()方法的执行顺序。
5. xml配置文件中定义Bean的继承,xml的bean标签的abstract=true表示其为一个抽象Bean,需要注意,Spring中的抽象Bean和Java中的抽象Bean是不一样的。
- Spring学习三:Bean与配置元数据
- Spring学习(三):Spring中的bean配置
- (三)spring配置bean
- Spring学习笔记三: 通过注解配置Bean
- Spring学习(二十二) Bean配置的三种方式(XML、注解、Java类)介绍与对比
- spring学习笔记(3)Bean命名、定义与配置
- spring学习-2-配置bean
- spring bean依赖与配置
- 【Spring三】使用注解配置bean
- 三Spring中的Bean配置基础2
- spring学习总结(三):IOC & DI 配置 Bean 之配置形式及依赖注入方式
- 学习Spring(三) 设置Bean作用域
- Spring4学习(三):注解配置bean
- spring学习笔记:bean的配置
- spring学习笔记:bean的配置
- Spring学习笔记----注解方式配置bean
- Spring学习第三天:配置Bean-1
- Spring学习第四天:配置bean-2
- js中return的用法
- acm_斐波那契数列
- C++类的大小及虚函数表
- sql 还原数据库 错误3154
- BufferedWriter.write()写中文乱码的问题
- Spring学习三:Bean与配置元数据
- NYOJ-1058-部分和问题
- 配置程序成为Linux服务
- Policy Gradient Methods for Reinforcement Learning with Function Approximation
- BZOJ 1497 [NOI2006]最大获利
- 自适应Simpson积分
- 软件测试#测试方法
- 使用setInterval()方法做一个倒计时
- JavaScript 实现深拷贝