admin管理员组

文章数量:1293757

今天在学习springboot的时候报了一个错

网上搜了一圈,主要有两条路,我就是第二条路。。。。
1、多余的@autowired

2、待实例化的类里必须有默认的构造方法(即没有参数的那种)

那么问题来了,为什么会这样呢?

因为IOC利用了java的反射,而spring的反射要求这个bean必须要有一个无参构造器。
but,并不是说反射一定要有无参构造器,但是spring显然是只能由无参构造器创建新对象的。关于反射调用构造器可以看:[使用反射调用构造器]
(https://blog.csdn/ziyonghong/article/details/81428212)
一般来说反射是这样实现的:
Class class = Class.forName(className);
Object object= class.newInstance();
所以需要一个无参的构造器来生成对象(因为没有给初始值)。
当然也可以通过有参构造创建。

spring 4.3之前
@Configuration应该有一个默认的no-args构造函数.
从javadoc开始:
@Configuration classes must have a default/no-arg constructor and may
not use @Autowired constructor parameters.

spring 4.3之后
@Configuration classes support constructor injection.

spring实现起来还蛮简单的,applicationContext.xml配置文件中使用constructor-arg标签来指明实例在初始化时候使用的构造函数并且为构造函数的参数赋值就好了。

但是autowired不用配置文件我还不知道咋搞。。。。。
感兴趣的童鞋可以去研究下实现,我去码我的代码去了。。。。。。。

本文标签: TypeBeandefiningjavaConfiguration