热点新闻
InitializingBean、@PostConstruct、@Bean(initMethod = "init")的作用和比较
2023-07-05 10:53  浏览:903  搜索引擎搜索“手机速企网”
温馨提示:信息一旦丢失不一定找得到,请务必收藏信息以备急用!本站所有信息均是注册会员发布如遇到侵权请联系文章中的联系方式或客服删除!
联系我时,请说明是在手机速企网看到的信息,谢谢。
展会发布 展会网站大全 报名观展合作 软文发布

需求背景:

1、项目启动时,加载缓存

2、项目启动时,开启对外服务端

一、InitializingBean实现

InitializingBean简介:

InitializingBean是Spring提供的拓展性接口,InitializingBean接口为bean提供了属性初始化后的处理方法,它只有一个afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行该方法。

InitializingBean用法:

package com.pcf.spdemo.configuration; import com.pcf.spdemo.common.httpserver.NettyServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class BeanInit implements InitializingBean { private static Logger log = LoggerFactory.getLogger(BeanInit.class); @Autowired private NettyServer nettyServer; @Override public void afterPropertiesSet() throws Exception { log.info("netty----------------------------------"); init(); } private void init() { new Thread(){ @Override public void run() { nettyServer.start(); } }.start(); log.info("netty对外服务端已启动..."); } }

效果图:




1.PNG

二、@PostConstruct注解实现

@PostContruct是JDK自带的注解,用来修饰非静态void方法。spring初始化该bean后,会执行bean中的该方法。

示例代码:

package com.pcf.spdemo.configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class InitCache { private static Logger log = LoggerFactory.getLogger(InitCache.class); @PostConstruct public void init() { log.info("通过@PostConstruct注解,实现项目启动时加载缓存..."); } }

效果展示:




2.PNG

三、通过配置@bean的init-method属性实现

代码实现:

package com.pcf.spdemo.configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @Component public class InitCache { private static Logger log = LoggerFactory.getLogger(InitCache.class); @Bean(initMethod = "init") public void init() { log.info("通过配置@bean的init-method属性,实现项目启动时加载缓存..."); } }

效果展示:




3.PNG

四、通过bean构造方法实现

bean初始化时实现。(没见用过,最好别用这种方式)

代码实例:

package com.pcf.spdemo.configuration; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class InitCache { private static Logger log = LoggerFactory.getLogger(InitCache.class); public InitCache() { init(); } public void init() { log.info("通过放入bean构造方法,实现项目启动时加载缓存..."); } }

效果展示:




4.PNG

五、四种方式优先级比较

测试代码:

package com.pcf.spdemo.configuration; import com.pcf.spdemo.common.httpserver.NettyServer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Component public class BeanInit implements InitializingBean { private static Logger log = LoggerFactory.getLogger(BeanInit.class); @Autowired private NettyServer nettyServer; public BeanInit() { init2(); } @Override public void afterPropertiesSet() throws Exception { log.info("netty----------------------------------"); init(); } private void init() { new Thread(){ @Override public void run() { nettyServer.start(); } }.start(); log.info("netty对外服务端已启动..."); } @PostConstruct public void init1() { log.info("通过@PostConstruct注解,实现项目启动时加载缓存..."); } public void init2() { log.info("通过放入bean构造方法,实现项目启动时加载缓存..."); } @Bean(initMethod = "init") public void init3() { log.info("通过配置@bean的init-method属性,实现项目启动时加载缓存..."); } }

测试结果展示:




5.PNG

由此可以看出:

优先级: 构造方法 > @PostContruct > afterPropertiesSet() > init-method

发布人:5a7a****    IP:61.145.95.***     举报/删稿
展会推荐
让朕来说2句
评论
收藏
点赞
转发