spring扩展点之InitializingBean接口实战

前言:InitializingBean接口让我们可以干涉bean的初始化过程,算是spring给我们提供的一个扩展点咯,凡是继承InitializingBean接口的类,在创建bean的时候都会执行afterPropertiesSet方法,在这个方法里面我们可以写一些自己的业务逻辑。

文章概括

实战场景之把配置类java代码化

把配置类java代码化是什么鬼哦,就是把application.properties或者application.yml中的配置属性通过InitializingBean接口封装成一个java对象,方便他人调用这些属性。代码就是下面这样。点击学习@Value注解详解

@Component
public class testBean implements InitializingBean {
    @Value("${Good.name}")
    private String goodName;
    @Value("#{100}")
    private String goodPrice;
    public static String GOODNAME;
    public static String GOODPRICE;

    public testBean() {
        System.out.println("testBean创建");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("testBean创建之后进行属性设置");
        GOODNAME = this.goodName;
        GOODPRICE = this.goodPrice;
    }
}

测试

在springBoot项目中随便找个service实现类,看是否属性已经注入进去了。

@Service
@Slf4j
public class GoodsServiceImpl extends ServiceImpl<GoodsMapper, Goods> implements GoodsService {
    public void testInitializingBean() {
        log.error("goodName: " + testBean.GOODNAME);
        log.error("goodPrice: " + testBean.GOODPRICE);
    }
}

答疑

1:可能有些小伙伴此时在想,我在需要用到yml属性的service实现类中直接用@Value注解注入不就行了嘛,干嘛写这么个封装类讷,不是多此一举嘛:(公司开发讲究的是代码的复用性和可维护性,等下我yml中的属性变一个名字,我改这个封装类就好了,而你需要动刀很多个用@Vlue这种方式注入的类
2:还有些小伙伴可能会想,直接写成下面,goodName前面加个static关键字不就行了嘛,干嘛要多一步赋值的操作,不是多此一举嘛,但是经过本人测试,goodName注入不进来一直为null,与spring源码有关,以后细究!不过下面这种写法给goodName、goodPrice加个set、get方法别的类调用get方法还是能获取到值的。

@Component
public class testBean implements InitializingBean {
    @Value("${Good.name}")
    public static String goodName;
    @Value("#{100}")
    public static String goodPrice;
  

    public testBean() {
        System.out.println("testBean创建");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("testBean创建之后进行属性设置");
    }
}
上一篇:Spring中的InitializingBean接口


下一篇:【Spring注解驱动开发】使用InitializingBean和DisposableBean来管理bean的生命周期,你真的了解吗?