spring
轻量级的javaEE解决方案。
轻量级:①可移植②对运行环境没有额外要求
注入
通过spring工厂以及配置文件为锁创建的成员变量进行赋值。
目的:解耦合
注入的方式
1)set注入
2)构造注入
控制反转IOC
控制:对成员赋值的控制权。
反转(转移):将这个控制权从代码转移到spring工厂以及配置文件。
依赖注入DI
当一个类需要另一个类的时候就是依赖另一个类,可以将其作为成员变量,使用spring工厂以及配置文件进行注入。
spring工厂创建复杂对象的三种方式
1)实现FactoryBean接口
使用getBean(“id”)获取的是getObject方法的返回值。
使用getBean("&id") 获取的是getObject方法的返回对象的bean对象
2)实例工厂
3)静态工厂
Bean对象的生命周期
什么是生命周期?
由spring负责对象的创建、存活、销毁。
生命周期分为三个阶段。
1)创建
2)初始化
3)销毁
什么时候创建对象
1)对于单例对象,在spring工厂创建时创建对象。
(也可以使用懒创建)
2)对于原型对象,在使用对象时,进行创建。
初始化
创建对象后会进行初始化
初始化的两种方法
1)实现InitializingBean接口,继而实现afterPropertiesSet的方法.
在initializeBean的方法中调用了invokeInitMethods方法,在invokeInitMethods会判断bean是否实现了InitializingBean接口,如果实现了个该接口,则调用afterPropertiesSet方法执行自定义的初始化过程,invokeInitMethods实现代码如下:
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
throws Throwable {
//判断是否实现了InitializingBean接口
boolean isInitializingBean = (bean instanceof InitializingBean);
if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
if (logger.isDebugEnabled()) {
logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
}
if (System.getSecurityManager() != null) {
try {
AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
((InitializingBean) bean).afterPropertiesSet();
return null;
}
}, getAccessControlContext());
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
//调用afterPropertiesSet方法执行自定义初始化流程
((InitializingBean) bean).afterPropertiesSet();
}
}
if (mbd != null) {
String initMethodName = mbd.getInitMethodName();
if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
!mbd.isExternallyManagedInitMethod(initMethodName)) {
invokeCustomInitMethod(beanName, bean, mbd);
}
}
}
2)使用一个普通方法进行初始化,反射原理,配置文件使用init-method标签直接注入bean
<bean id="user" class="Bean.User" init-method="myInit"></bean
销毁
spring什么时候销毁对象?
关闭工厂时销毁。applicationContext.close()
销毁对象前调用对象的销毁方法。(销毁方法主要完成对资源的释放)
销毁方法只适用于单例对象。
1)实现DisposableBean,重写destroy()方法
2)不同方法
<bean id="" class="" destory-method="myDestory"> </bean>
后置处理Bean
目的:对spring创建的bean进行再加工。
实现BeanPostProcessor接口
AOP底层用到了BeanPostProcessor接口