Consider defining a bean of type ‘java.lang.String‘ in your configuration

本文探讨了在学习SpringBoot时遇到的错误,主要涉及两个解决方向:移除多余的@Autowired注解和确保待实例化类有默认构造器。由于Spring依赖反射机制,它要求bean具有无参构造器以便创建对象。虽然反射并不强制要求无参构造器,但Spring的实现方式决定了其依赖这一点。从Spring 4.3开始,@Configuration类支持构造器注入。博客作者分享了相关知识并鼓励读者深入研究。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

因为IOC利用了java的反射,而spring的反射要求这个bean必须要有一个无参构造器。
but,并不是说反射一定要有无参构造器,但是spring显然是只能由无参构造器创建新对象的。关于反射调用构造器可以看:[使用反射调用构造器]
(https://blog.youkuaiyun.com/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不用配置文件我还不知道咋搞。。。。。
感兴趣的童鞋可以去研究下实现,我去码我的代码去了。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值