Spring Bean初始化的几种方式

129 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

前言

我们在Spring项目当中,有些时候需要在Bean创建出来后做一些初始化的操作,比如项目启动后自动加载缓存,或者Bean创建好后创建线程池或者链接池等操作;面对这种应用场景,我们应该如何使用Spring来完成呢?

配置方式

我们在以前使用xml配置Bean的时候,经常会使用到init-method这么一个属性,我们来看一个示例:

package com.test.service;
 
public class UserService{
 
 public void init(){
     // TODO
     // 执行初始化操作
}
}

xml编写示例如下:

<bean id="myService" class="com.test.service.UserService" init-method="init"></bean>

我们通过在xml中指定UserService这个Bean创建完毕后第一时间执行方法名称为init的初始化方法;

注解方式

第二种指定初始化的方式就是注解,我们通常会使用@PostConstruct注解来标注Bean的初始化方法:

package com.test.service;
 
@Service
public class UserService{
 
 @PostConstruct
 public void init(){
     // TODO
     // 执行初始化操作
}
}

关于@PostConstruct的实现原理在前面的文章Spring中@PostConstruct是如何实现的详细讲解过,感兴趣的小伙伴可以了解一下;主要原理还是利用了Spring的生命周期扩展点BeanPostProcessor实现的;

实现指定接口

第三种方式就是要求目标类实现指定的接口InitializingBean,这个接口里面有一个需要实现的方法afterPropertiesSet(),很明显这个方法的意思就是在Bean的所有属性值都设置完毕后调用:

package com.test.service;
 
@Service
public class UserService implements InitializingBean{
 
 public void afterPropertiesSet(){
     // TODO
     // 执行初始化操作
}
}

实现了这个接口的Bean在所有的属性值被设置后将会自动调用afterPropertiesSet()方法;

注意

在设置初始化方法时,有以下几个注意点:

1.初始化方法不可以有任何参数,否则将执行失败;

2.xml配置方式与实现InitializingBean接口的方式只可以设置一个初始化方法,@PostConstruct注解方式可以设置多个注解方法,甚至允许父类也通过@PostConstruct注解方式设置初始化方法;

3.初始化方法的修饰符不可以是static修饰;

小结

通过上述讲解,我们大概知道了有三种方式配置Bean的初始化方法:

1.xml配置属性init-method来设置Bean的初始化方法名称;

2.通过注解@PostConstruct标注初始化方法;

3.通过实现接口InitializingBeanafterPropertiesSet()方法来实现Bean的初始化;