qq_44024108 2022-08-26 15:13 采纳率: 100%
浏览 69
已结题

spring自动装配的问题

在学习spring自动装配的时候,发现一个问题,在某些情况下自动装配会找不到bean。

首先在正常情况下,spring可以正常自动装配:

public class Hello {
    public String hello(){
        return "hello world";
    }
}
public class XiaoMing {
    private Hello hello;

    public XiaoMing(){}

    public XiaoMing(Hello hello) {
        this.hello = hello;
    }

    public String sayHello() {
        return hello.hello();
    }

    public void setHello(Hello hello) {
        this.hello = hello;
    }

    public Hello getHello() {
        return hello;
    }
}
public class Application {
    public static void main(String[] args) {
        GenericApplicationContext context = new GenericApplicationContext();
        new XmlBeanDefinitionReader(context).loadBeanDefinitions("autowiring.xml");
        context.refresh();
        XiaoMing xiaoMing = context.getBean("xiaoMing", XiaoMing.class);
        System.out.println(xiaoMing.sayHello());
    }
}
<bean id="hello" class="com.nnkomatsu.Hello"/>
<bean id="xiaoMing" class="com.nnkomatsu.dependencyInjection.XiaoMing" autowire="byName"/>

此时运行结果一切,可以正常返回hello world。

但是当修改了依赖的的getter之后,就出现了一点问题,有时候无法正常装配,有时候又可以:
比如我把XiaoMing类改成以下这样:

public class XiaoMing {
    private Hello hello;

    public XiaoMing(){}

    public XiaoMing(Hello hello) {
        this.hello = hello;
    }

    public String sayHello() {
        return hello.hello();
    }

    public void setHello(Hello hello) {
        this.hello = hello;
    }

        public String getHello() {
        return "hello";
    }
}

就只是修改了getHello的返回值,此时运行后就出现问题了,没有正常装配上hello对象:

img

然后我又试了让getHello返回一些其它返回值,发现当返回一些java内置的类时,自动装配就会出问题,但是有些又没问题:

//失败
    public Date getHello(){
        return new Date();
    }

//正常
    public List<?> getHello(){
        return new ArrayList<>();
    }

//正常
    public ApplicationContext getHello(){
        return new ClassPathXmlApplicationContext();
    }

我感觉这种自动装配应该跟setter有关吧,不知道为啥getter也会影响自动装配,而且还有时候正常有时候不正常,求解答。

  • 写回答

2条回答 默认 最新

  • qq_44024108 2022-08-26 16:35
    关注

    经过github上老哥的提醒,发现原来是跟BeanUtils下面这段代码有关,自动装配在判断是简单类型之后就不会装配了,比如int,date,string等等,这些类型需要手动注入,而判断就是通过getter去判断的。

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月3日
  • 已采纳回答 8月26日
  • 创建了问题 8月26日

悬赏问题

  • ¥15 能给我一些人生建议吗
  • ¥15 mac电脑,安装charles后无法正常抓包
  • ¥18 visio打开文件一直显示文件未找到
  • ¥15 请教一下,openwrt如何让同一usb储存设备拔插后设备符号不变?
  • ¥30 使用quartz框架进行分布式任务定时调度,启动了两个实例,但是只有一个实例参与调度,另外一个实例没有参与调度,不知道是为什么?请各位帮助看一下原因!!
  • ¥50 怎么获取Ace Editor中的python代码后怎么调用Skulpt执行代码
  • ¥30 fpga基于dds生成幅值相位频率和波形可调的容易信号发生器。
  • ¥15 R语言shiny包和ncdf4包报错
  • ¥15 origin绘制有显著差异的柱状图和聚类热图
  • ¥20 simulink实现滑模控制和pid控制对比,提现前者优势