装配bean基于XML

1.实例化方式

3种实例化bean的方式:默认构造、静态工厂、实例工厂

默认构造:<bean id="" class="">//默认构造(必须提供默认构造)

静态工厂:常用于spring整合其他框架(工具)

用于生成实例对象,所有的方法必须是static

<bean id="" class="工厂全限定类名(包名+类名)" factory-method="静态方法">

实例工厂:

必须先有工厂实例对象,通过实例对象创建对象,提供所有的方法都是非静态的

//创建工厂实例

<bean id="工厂实例id名" class="全限定类名"></bean>

//获取service

//factory-bean:确定工厂实例

//factory-method:确定普通方法

<bean id="...service" factory-bean="工厂实例id名" factory-method="方法名"></bean>

此处有一个问题:

普通的bean都是<bean id="" class="FB"></bean>,spring直接创建A实例,并返回()//相当于FB fb = new FB();return fb

FactoryBean是一个特殊的bean,它具有工厂生产对象的能力,只能生成特定的一个对象

bean必须使用FactoryBean接口,此接口提供方法getObject()用于获得特定bean

<bean id="" class="FB">先创建FB实例,然后调用getObject(),并返回方法的返回值

相当于FB fb = new FB();return fb.getObject()

BeanFactory和FactoryBean对比:

BeanFactory:工厂,用于生成任意bean,也就是之前用的普通bean

FactoryBean:是特殊的bean,它是用来生成另一个特定+的bean

spring作用域:scope="singleton/prototype/request/session/global seesion"

初始化和消亡:

init-method:用于配置初始化方法,准备数据

destroy-method :用于配置销毁方法,清理资源

目标方法执行前执行后,将进行初始化或销毁

<bean id="" init-method="初始化方法名" destroy-method="销毁方法名">

注:销毁方法执行有两个条件,一是容器必须close,二是必须是单例的(即在配置中scope="singleton")

String xmlPath = "..../beans.xml";

Application application = new ClassPathXmlApplicationContext(xmlPath);

application .close()

//applicationContext.getClass().getMethod("close").invoke(applicationContext);

BeanPostProcessor后处理Bean

Spring提供一种机制,只要实现此端口BeanPostProcessor,并将实现类提供给spring容器,sring容器将自动执行,在初始化方法前执行

before(),在初始化后执行after()

Spring提供工厂勾子,用于修改实例对象,可以生成代理对象,是AOP底层

模拟过程:

A a = new A();

a = B.before(a);

a.init();

a = B.after(a);(前面的相当于是代理a) //将a的实例对象传递给后处理bean,可以生成代理对象并返回

a.add();//生成代理对象,目的是在目标方法前后执行(例如:开启事务、提交事务)

a.destroy();

猜你喜欢

转载自my.oschina.net/u/3686592/blog/2873943
今日推荐