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日

悬赏问题

  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?