spring配置
一。管理bean的生命周期

1.初始化回调
在bean加载完成后,也就是上图中前两步完成后,可以设置一个回调函数来执行一下初始化操作,比如检查依赖项,执行特定的业务逻辑等。
方式:
(1)使用bean 标记的init-method属性(针对自己),或者beans标签的 default-init-method属性(针对所有的bean),指定特定的方法为初始化方法。
(2)实现InitializingBean接口,该接口有个方法afterProperty方法,会在初始化的时候调用。
(3)使用@PostConstruct指定初始化方法。
(4)使用@Bean注解的initMethod属性
示例:
@Bean(initMethod='init')
Singer singerone(){}
这个bean在初始化的时候就会调用Singer的init方法。
解析顺序:
(1)调用构造函数创建bean
(2)注入依赖项
(3)调用@PostConstruct注释的初始化方法
(4)调用afterPropertiesSet()方法。
(5)执行init-method属性中的方法。
2.销毁回调
在bean被销毁之前调用的方法,进行一下处理,比如资源释放,持久化保存信息等。
销毁方法跟初始化不同,必须手动触发,
(1)使用ApplicationContext的destroy方法。
(2)使用ApplicationContext的registerShutdownHook()方法,关闭钩子。
方式:
(1)<bean>标签的destroy-method属性,注意,原型作用域不会调用。
(2)实现DisposableBean接口,重写destroy()方法。
(3)使用注解@PreDestroy
(4)使用@Bean注解的destroyMethod属性
示例:
@Bean(destroyMethod='destroy')
Singer singerone(){}
解析顺序:
(1)注解@PreDestroy
(2)调用DisposableBean接口的destroy方法
(3)xml中配置的方法。
二。让spring感知bean
实现后缀为aware的接口,spring在初始化的时候会把相应的bean注入到该bean中。
1.BeanNameAware接口,设置bean名称
2.ApplicationContextAware接口,设置ApplicationContext对象到bean中,方便使用。
三。FactoryBean
当bean无法用new进行创建的时候,比如单例设计模式,需要调用静态方法创建对象。可以使用实现FactoryBean接口来获取对象实例。
示例:
public class MessageDigestFactoryBean implements FactoryBean<MessageDigest>,InitializingBean{
private string algorithmName = 'MD5';
private MessageDigest messageDigest=null;
//该方法是spring自动调用,在使用getBean()的时候调用该方法返回对象。
public MessageDigest getObject() throw Exception{
return messageDigest;
}
public Class<MessageDigest> getObjectType(){
return MessageDigest.Class;
}
public boolean isSingleton(){
return true;
}
public void afterPropertiesSet(){
messageDigest=MessageDigest.getInstance("algorithmName");
}
public void setAlgorithmName(string algorithmName){
this.algorithmName = algorithmName;
}
}
说明:
(1)当用上面的类创建bean的时候,获取到的是调用getObject返回的对象。如果想获取上面工厂对象,使用applicationContext.getBean("&beanName"),但是不建议使用这个对象。
(2)还可以使用Java配置方式创建上面的bean,但是使用@Bean创建的工厂对象需要手动调用getObject方法。
(3)实现了FactoryBean接口必然有getObject方法,但是对于一些第三方的非spring应用程序提供的Javabean,可能就没有这个方法。为了解决这个问题,可以使用<bean>标签的factory-bean和factory-method属性。
factory-bean指定bean对象,factory-method指定获取该对象的方法,可以这样理解,上面的getObject方法是spring固定的所以不用这种factory-method方法。
四。JavaBean PropertyEditor
BeanFactory配置文件中大部分都是使用string,但是,内部类型未必是string,需要进行映射。
spring内置了14个Property Editor,这些都会自动的调用,在获取配置的时候转换成正确的类型。

另外,spring还提供了自定义的方式定义自己的转换器。
定义自己的转换器需要扩展PropertyEditorSupport类,重新setAsText方法。
然后用下图中的方式注册进customEditors中,这样在引用FullName的使用spring就会自动的调用解析器。

五。ApplicationContext扩展功能
1.国际化支持,ApplicationContext扩展了MessageSource,可以直接支持国际化,尽量不要使用单独MessageSource实例,applicationContext.getMessage("msg",null,english);
2.事件发布
applicationContext.publishEvent(new Event());
3.资源管理和访问
(1)文件系统:applicationContext.getResource("file://"+file.getPath());
(2) 类路径:applicationContext.getResource("classpath:test.txt");
(3) url: applicationContext.getResource("http://www.google.com");
4.额外的生命周期接口
5.改进基础设施组件的自动配置
浙公网安备 33010602011771号