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 Torch not compiled with CUDA enabled
  • ¥15 三种节点编号优化算法比较
  • ¥15 比特币ord程序wallet_constructor.rs文件支持一次性铸造1000个代币,并将它们分配到40个UTXO上(每个UTXO上分配25个代币),并设置找零地址
  • ¥115 用Java解决探地雷达dzt文件的解析过程
  • ¥20 有关神经网络这道(b)determine the parameters of neural network
  • ¥25 annaconda jvpyter
  • ¥20 来一个会抓包app支付接口的
  • ¥30 vivado2017.4的sdk打不开
  • ¥50 matlab,文献复现
  • ¥20 寻找Flink CDC指导,有偿咨询