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.改进基础设施组件的自动配置

 

posted on 2019-07-31 11:42  云无形  阅读(148)  评论(0)    收藏  举报