Spring @Autowired自动装配

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Spring @Autowired自动装配

陈玉林   2022-05-23 我要评论

学习自动装配之前,讲一个概念:Component,即组件。组件你也可以理解为bean对象,只不过通常Component的组成会稍微复杂一些,比如,一个组件里面会引用一个或多个别的bean对象,组件的定义方式也不一样。自动装配貌似就是为组件而生的。

自动装配(Autowired)这个概念,如果你已经使用过SpringMVC或者SpringBoot做开发,你会发现@Autowired注解是特别经常使用到的。比如你的Controller、Service相关的类里面就会经常用到。如果你看过@Controller或者@Service的定义,你会发现这两个注解也是使用了@Component注解的,就是说这两个注解也是Component。

自动装配就是说,你不用手动实现bean之间的组合关系,只要使用了@Autowired注解,程序就会自动的注入这个需要的bean,前提是你的Spring容器有这个bean。我们来看个例子。

这个例子是这么回事,我定义了一个Car接口,里面有一个run()方法,然后我定义了一个BaoMaCar,实现了Car接口,然后我定义了一个Test.java类,我在BaoMaCar和Test上使用了@Component注解,表明我这两个类需要创建由Spring管理的bean对象,有点绕,这么说会更好理解:使用了@Component之后,Spring会使用这两个类创建出相应的bean对象,并放到容器中。还有一个MyConfig.java类,上面使用了@Configuration和@ComponentScan注解,这个类是一个Spring配置类,如果你没有看过我的上一篇文章,建议你看一下,上篇文章介绍了使用Java配置Spring的方式。因为我要启动Spring上下文就是需要这个配置类,同时我也需要让Spring发现这些我声明的Component,所以还需要使用@Component注解(中文意思:组件扫描),参数是当前的包,默认就扫描当前package下的所有类,看看哪个类上面使用@Component注解就把哪个类交由Spring管理。直接看代码吧!

package demo2;

public interface Car {
    void move();
}
package demo2;
import org.springframework.stereotype.Component;
@Component
public class BaoMaCar implements Car {
    private String driver = "小白开";
    public void move() {
        System.out.println(driver+"正在开车");
    }
}
package demo2;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan("demo2")
public class MyConfig {
}
package demo2;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class Test {
    @Autowired
    private Car car;

    public Car getCar() {
        return car;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        Test test = context.getBean(Test.class);
        test.getCar().move();
        context.close();
    }
}

你可能觉得我说半天跟自动配置有什么关系?看一下最后一个类——Test.java,里面用到了@Autowired注解,当我启动main()方法的时候,你猜会发生什么?控制台会打印:“小白正在开车”。是不是觉得好奇怪?这是怎么做到的?听我为你慢慢道来。我从上下文中拿到了一个Test类的对象,我Test类本身就是使用了@Component注解的,所以上下文启动之后容器中就已经创建好了Test的对象。那Test对象的Car car属性怎么会没有报空指针错误呢?没错了,就是在创建Test的对象时,Spring发现这个类的Car car属性使用@Autowired注解,于是就在容器中找实现了Car接口的对象,一番搜索之后,找到了BaoMaCar的对象,于是就把这个对象注入到Test的对象的car属性中了。是不是很厉害?当然了,当容器中有多个实现了Car接口的对象时,这个写法是有问题的,因为Spring知道你需要一个实现了Car接口的对象,但是由于有多个符合这个条件的对象,所以无法实现帮你自动注入,因此会发生异常。解决的办法就好几种。我就不一一列举了,还是那句话,师傅领进门,修行靠个人,你应该自己去探索一下。

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们