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();