Spring 的InitializingBean接口

InitializingBean接口为bean提供了初始化方法的方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,在初始化bean的时候会执行该方法。

测试程序如下:

/**
 * @author jy
 * @date 2018年5月15日
 * <p>Description: </p> 
 */
package com.dubbo.service.impl;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;

/**
 * 
 *
 */
@Component("testBean")
public class TestInitializeBean implements InitializingBean{

    /* (non-Javadoc)
     * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
     */
    @Override
    public void afterPropertiesSet() throws Exception {

        System.out.println("initialize bean");
    }

}

main程序如下
/**
 * @author 
 * @date 2018年5月4日
 * <p>Description: </p> 
 */
package dubboprovider;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dubbo.service.impl.UserServiceImpl;

/**
 * @author 
 *
 */
public class ApplicationTest {

    /**
     * @param args
     *<p>Description: </p>  
     */
    public static void main(String[] args) {

        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        context.start();
//      UserServiceImpl userServiceImpl=(UserServiceImpl) context.getBean("userService");
//      String n=userServiceImpl.getName("10");
        synchronized (ApplicationTest.class) {
            while(true){
                try {
                    ApplicationTest.class.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            
        }
            
        }
    }

}

运行main程序结果


image.png

这说明在spring初始化bean的时候,如果bean实现了InitializingBean接口,会自动调用afterPropertiesSet方法。

实现InitializingBean接口与在配置文件中指定init-method有什么不同?

修改配置文件,加上init-method配置,修改如下:

<bean id="testBean"
class="com.dubbo.service.impl.TestInitializeBean" init-method="testInitial">
</bean>
运行main程序,结果


image.png

由结果可看出,在spring初始化bean的时候,如果该bean是实现了InitializingBean接口,并且同时在配置文件中指定了init-method,系统则是先调用afterPropertiesSet方法,然后在调用init-method中指定的方法。
总结

1:spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用

2:实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是init-method方式消除了对spring的依赖

3:如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。总结

1:spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用

2:实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是init-method方式消除了对spring的依赖

3:如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。

Map<K, V> CACHES = new ConcurrentHashMap<K, V>();还有这个

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容