难忘的一次@Autowired
前段时间对代码进行重构,其中有一点有和上司有聊到@Autowired,其实主要是我对代码进行重构所引发的问题,其实也不是问题,但是我觉得有必要记录下来。
@Autowired,是spring提供自动装配的一个注解,与其并行的还有J2EE提供的@Resource。
属性上?构造上?setter上?可能很多人对这些小细节都没有过于关注吧。
重构之前:
1 2 3 4 5 6 7 8 |
@Autowired private RedisHelper redisHelper; @Autowired private IdentityHelper identityHelper; @Autowired private KouBeiApiHelper kouBeiApiHelper; @Autowired private ShopManager shopManager; |
重构之后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
@Autowired public ShopController(MeituanDeveloperConfig developerConfig, ELeMeDevelopConfig eLeMeDevelopConfig, RedisHelper redisHelper, IdentityHelper identityHelper, KouBeiApiHelper kouBeiApiHelper, ShopManager shopManager, KouBeiDevelopConfig kouBeiDevelopConfig) { this.developerConfig = developerConfig; this.eLeMeDevelopConfig = eLeMeDevelopConfig; this.redisHelper = redisHelper; this.identityHelper = identityHelper; this.kouBeiApiHelper = kouBeiApiHelper; this.shopManager = shopManager; this.kouBeiDevelopConfig = kouBeiDevelopConfig; } |
我这么做,我的解释是:如果一个属性在初始化的时候要用到其中的某一个组件,则会报NPE,如:
1 2 3 4 5 6 7 8 |
@Autowired private MeituanDeveloperConfig developerConfig; private String sign; public ShopController() { this.sign = developerConfig.getSign(); } |
因为Java类会先执行构造方法,而@Autowired是在类加载完之后装配的bean,所以在执行构造方法的时候,就会报NPE。
其实@Autowired用在属性上也是有好处的,添加直接加两行就可以了,而我这种需要修改构造方法,修改删除也是同样的道理,所以,这就是我上司所认为的理由。
我觉得吧,一个是防止自己或其他开发人员在不小心使用的情况下初始化某成员变量而造成NPE,一个是方便。
我个人觉得这是有必要的,但不是非它不可的,有不同意见的欢迎一起讨论。
不同的信念,决定不同的命运!
ChoviWu
此写法确实可以防止NPE,倘若在构造函数中有依赖bean,此时bean未被注入,确实是一种防止的措施,注入的bean太多的时候这种写法又过于臃肿
viagra cialis
Thanks very interesting blog!