前言:InitializingBean接口让我们可以干涉bean的初始化过程,算是spring给我们提供的一个扩展点咯,凡是继承InitializingBean接口的类,在创建bean的时候都会执行afterPropertiesSet方法,在这个方法里面我们可以写一些自己的业务逻辑。
文章概括
- 实战场景之把配置类java代码化
- 测试
- 答疑
实战场景之把配置类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创建之后进行属性设置");
}
}