Spring的InitializingBean接口解析

 更新时间:2024年02月14日 09:13:45   作者:我是坑货  
这篇文章主要介绍了Spring的InitializingBean接口解析,InitializingBean是spring为bean的初始化提供了一种新的方式,里面只有一个方法afterPropertiesSet,作用就是实现这个接口或者实现了继承InitializingBean的方法的bean都要执行这个方法,需要的朋友可以参考下

Spring的InitializingBean接口解析

之前知道spring的InitializingBean,但是没怎么关注,最近在一次代码改造的使用工厂模式和策略模式的情况下,发现InitializingBean。

InitializingBean是spring为bean的初始化提供了一种新的方式,里面只有一个方法afterPropertiesSet,作用就是实现这个接口或者实现了继承InitializingBean的方法的bean都要执行这个方法。

举个例子:

@Component
import org.springframework.beans.factory.InitializingBean;
public class TestInitializingBean implements InitializingBean{
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println(" 张鹏真的很帅 InitializingBean");        
    }
    public void testInit(){
        System.out.println("张鹏真的很帅");        
    }
}

调起spring程序会打印出

张鹏真的很帅 InitializingBean

这个单个看起来没啥用,但是结合实际情况就不一样 比如说我想在下面这个工厂类里面的map添加值

@Component
public class ValidAssetByTypeFactory {

    private static Map<String,ValidateAssetService> validAssetTypeMap = new HashMap<>();

    /**
     * 用来维护根据类型验证资产的规则的map
     * @param type
     * @return
     */
    public static ValidateAssetService getInvokeStrategyMap(String type){
        return validAssetTypeMap.get(type);
    }

   

}

实际上这个validAssetTypeMap ,这个map是静态的你要是真要想往里面塞值的话,只能在这个类下面写个静态方法或者一个一个静态块往这个map里面塞值,类似这样:

static
{
validAssetTypeMap.put ("A","AStragey");
validAssetTypeMap.put ("B","BStragey");
validAssetTypeMap.put ("C","CStragey");
}

但是有了这个InitializingBean,可以这么玩:

(1)我先实现一个InitializingBean的接口

public interface ValidateAssetService extends InitializingBean {

    Result<List<DetailsAppAsset>> validateAssetByType(List<AssetDO> assetDOList,String type);
}

(2)我在这个工厂类里面添加一个静态的方法,用来往这个静态map添加值

注意这个register方法

public class ValidAssetByTypeFactory {

    private static Map<String,ValidateAssetService> validAssetTypeMap = new HashMap<>();

    /**
     * 用来维护根据类型验证资产的规则的map
     * @param type
     * @return
     */
    public static ValidateAssetService getInvokeStrategyMap(String type){
        return validAssetTypeMap.get(type);
    }

    /**
     * 注册(创建实现类直接注册即可,不需要在该类放进策略map里面)
     * @param type
     * @param validateAssetService
     */
    public static void register(String type, ValidateAssetService validateAssetService){
        if(StringUtil.isEmpty(type)||null == validateAssetService){
            return;
        }
        validAssetTypeMap.put(type,validateAssetService);
    }

}

(3)由于上一步给我们往静态map添加值留了一个口子,我们要利用InitializingBean初始化会执行afterPropertiesSet的特性在spring执行起来的时候直接调用这个方法往静态map里面塞值。

注意这个afterPropertiesSet方法的实现:

@Component
public class RepairAssetValidate implements ValidateAssetService {
    @Override
    public Result<List<DetailsAppAsset>> validateAssetByType(List<AssetDO> assetDOList, String type) {
        if( CollUtil.isEmpty(assetDOList)  ){
            return resultCreator.create(AssetErrorCode.ASSET_NOT_EXISTS, EntityConverter.convertList(assetDOList, DetailsAppAsset.class));
        }
        for(AssetDO assetDO : assetDOList){
            if( assetDO.getQuoteOrderId() != null ){
                return resultCreator.create(AssetValidErrorCode.ASSET_IN_OTHER_OPERATOR,"资产已被"+ QuoteOrderType.getQuoteOrderType(assetDO.getQuoteOrderType())+"引用" ,EntityConverter.convertList(assetDOList, DetailsAppAsset.class));
            }
        }
        return resultCreator.create(ErrorCode.SUCCESS, EntityConverter.convertList(assetDOList, DetailsAppAsset.class));
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        ValidAssetByTypeFactory.register(AssetValidateType.REPAIR.getValue(),this);
    }
    @Autowired
    private ResultCreator resultCreator;
}

这样我们就可以在别的地方借用spring的InitializingBean来给别的静态数据结构塞值,整个过程可以方便我们扩展代码,感觉这种方式写代码更符合开闭原则。

到此这篇关于Spring的InitializingBean接口解析的文章就介绍到这了,更多相关InitializingBean接口内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java反射调用get/set方法实现

    java反射调用get/set方法实现

    本文文章介绍了在Java中使用反射调用get/set方法时,如何通过Introspector和PropertyDescriptor来更优雅地处理,下面就来详细的介绍一下,感兴趣的可以了解一下
    2025-12-12
  • 解读thymeleaf模板引擎中th:if的使用

    解读thymeleaf模板引擎中th:if的使用

    这篇文章主要介绍了解读thymeleaf模板引擎中th:if的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • Java如何比较两个对象并获取不相等的字段详解

    Java如何比较两个对象并获取不相等的字段详解

    这篇文章主要给大家介绍了关于Java如何比较两个对象并获取不相等的字段以及JAVA判断(获取)两个相同对象不同的数据的相关资料,文中通过实例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友可以参考下
    2021-11-11
  • 详解Java 微服务架构

    详解Java 微服务架构

    这篇文章主要介绍了Java 微服务架构的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • java使用nio2拷贝文件的示例

    java使用nio2拷贝文件的示例

    这篇文章主要介绍了java使用nio2拷贝文件的示例,需要的朋友可以参考下
    2014-04-04
  • JavaWeb如何实现禁用浏览器缓存

    JavaWeb如何实现禁用浏览器缓存

    这篇文章主要介绍了JavaWeb如何实现禁用浏览器缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • 使用Eclipse创建Maven的Java WEB项目的两种方式

    使用Eclipse创建Maven的Java WEB项目的两种方式

    本文详细介绍了如何在JDK 1.8、Maven 3.6.3和Eclipse 2017版本下创建Java Web项目,包括选择archetype方式、配置Tomcat、设置为Web3.1、配置Maven编译级别、修复Eclipse提示的错误、设置Maven源文件夹等步骤,需要的朋友可以参考下
    2024-11-11
  • 详解java模板和回调机制

    详解java模板和回调机制

    这篇文章主要为大家详细介绍了java模板和回调机制,学习java模板,感兴趣的朋友可以参考一下
    2016-03-03
  • 通过实例解析Java类初始化和实例初始化

    通过实例解析Java类初始化和实例初始化

    这篇文章主要介绍了通过实例解析Java类初始化和实例初始化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Java集合之Map接口的实现类精解

    Java集合之Map接口的实现类精解

    Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value;Map中的键值对以Entry类型的对象实例形式存在;键(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个建最多只能映射到一个值
    2021-09-09

最新评论