03 Spring框架 bean的属性以及bean前处理和bean后处理

整理了一下之前学习spring框架时候的一点笔记。如有错误欢迎指正,不喜勿喷。 上一节我们给出了三个小demo,具体的流程是这样的:

1.首先在aplicationContext.xml中添加<bean id="自定义id" class="包名.类名">。(还有两种工厂配置)

2.其次写一个自定义类,里面只包含一个系统输出的show()。

3.使用

ApplicationContext hw=new classpathXmlApplicationContext("applicationContext.xml");

实例化Spring容器。

4.最后用 HelloWorld hw=(HelloWorld)context.getBean("c1");获得对象,再使用对象hw调用show()方法测试对象是否创建: hw.show();

所以我们可以从上面的例子了解到,先写一个类,然后在applicationContext.xml中添加<bean id="" class="">实例,然后在TestHelloWorld中测试调用。 这个是ioc的最基本的一个流程。

接下来我们介绍bean的相关属性: ①bean在Spring中有两种基本类型(这两种比较常用,其他的我们不作介绍):singleton和prototype(单例和原型),Spring中默认使用单例,若请求为原型,那么Spring就会新建一个bean实例然后返回给程序。 单例和原型可以在bean中用scope属性设置 <bean id="" class="" scope="singleton/prototype"> 单例和原型有哪些区别?

(一)他们都能够创建对象,但是单例创建的实例成功后能够重复的使用(即如果已经创建成功,当请求需要再次建立已经创建的实例的话,Spring就检查容器中是否存在这个实例,如果存在就使用已经创建的实例,如果没有就新创建一个实例),而原型,每当有请求需要建创建实例的时候都需要新建一个实例(无论容器中是否存在相同已创建的实例)。

(二)它们创建对象的时机不同,单例在默认在Spring主配置文件被加载的时候就会被创建,而原型则是需要使用的时候创建对象。

②指定对象的初始化方法(用来初始化对象),利用bean中的init-method指定

<bean id="" class="" init-method="">

③指定对象销毁方法(想要指定必须要满足实例组件为单例,并且调用 AbstractApplicationContext容器对象的ac.close触发)

<bean id="" class="" destroy-method="">

④延时创建实例,使用lazy-init=“true”设定默认为false,实例不是立即创建,而是用到时用getBean方法调用创建(控制单例的创建时机)

<bean id="" class="" lazy-init="true">

什么事bean前处理,什么又是bean后处理: Spring提供了一个接口,我们可以定义一个类,实现这个接口,这个接口提供了两个方法

  • postProcessBeforeInitialization
  • postProcessAfterInitialization 分别会在对象的创建之前和创建之后调用, 实现这个接口可以帮助我们在一些情况下,在一个对象创建的前后添加一些日志和预处理,或者关闭处理。

接下来我们就来看看这个接口怎么实现:

public class postProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String service) throws BeansException {
        System.out.println("after");
        return bean;//这里的返回必须为bean
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String service) throws BeansException {
        System.out.println("before");
        return bean;//这里的返回必须为bean
    }

}

上面的这个类实现了BeanPostProcessor接口并提供了bean前方法和bean后方法,两个方法的参数都为我们想要生成的对象的引用。

想要使用这个方法,我们不仅需要定义这个类,还要在Spring主配置文件中注册一下:

<bean class="beanBeforeAndAfter.postProcessor"/>

这样在产生bean之间就会输出before和after。 上面就是这个实现类的具体使用方法(省略了具体的bean对象产生配置) 本篇文章就介绍到这里。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

python 用户交互

input是个内建函数,具体用法:接收用户输入的内容,输入的字符串,接收到就是字符串;输入的是数字,接收的就是数字

1092
来自专栏佳爷的后花媛

路由&模块化设计&命名空间

ThinkPHP采用模块化的架构思想,可以支持多模块应用的创建,让应用的扩展更加方便. 先简单说下路由规则:

1923
来自专栏黑泽君的专栏

java基础学习_IO流04_用户登录注册案例(IO版)、数据操作流(操作基本数据类型的流)、内存操作流、打印流、标准输入输出流、随机访问流、合并流、序列化流(对象操作流)、Properties属性集

java基础学习_IO流04_用户登录注册案例(IO版)、数据操作流(操作基本数据类型的流)、内存操作流、打印流、标准输入输出流、随机访问流、合并流、序列化流(...

941
来自专栏jmeter高手高高手

Jmeter(三十)_TimeShift函数在JSR223中的使用

日期 - 这是日期值。用于如果要通过添加或减去特定天数,小时或分钟来创建特定日期的情况。如果参数值未通过,则使用当前日期。

3153
来自专栏嵌入式程序猿

freeRTOS任务创建

我们曾经在公众号里给大家推送过关于freeRTOS在NXP kinetis KV4x上的移植,得到了猿友大量的反馈,很多猿友还是感觉对基础的一些东西不懂,今天我...

3987
来自专栏企鹅号快讯

Linux进阶命令和Shell编程

1.高级文本命令——sed1.1sed简介 sed全称是:Stream EDitor,即流编辑器,是一个很好的文本处理工具,本身是一个管道命令,处理时,把当前处...

2168
来自专栏C/C++基础

Linux命令(36)——awk命令

AWK是一个优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输...

1522
来自专栏大闲人柴毛毛

Java并发编程的艺术(三)——volatile

1. 并发编程的两个关键问题 并发是让多个线程同时执行,若线程之间是独立的,那并发实现起来很简单,各自执行各自的就行;但往往多条线程之间需要共享数据,此时在并...

4337
来自专栏java工会

阿里历年经典Java面试题汇总

1666
来自专栏封碎

Java多线程参考手册 博客分类: 经典文章转载

http://blog.csdn.net/ring0hx/article/details/6858582

702

扫码关注云+社区

领取腾讯云代金券