Spring框架学习之Spring @Autowired实现自动装配的代码

 更新时间:2021年12月31日 16:46:16   作者:陈玉林  
自动装配就是说,你不用手动实现bean之间的组合关系,只要使用了@Autowired注解,程序就会自动的注入这个需要的bean,前提是你的Spring容器有这个bean,这篇文章主要介绍了Spring @Autowired实现自动装配,需要的朋友可以参考下

学习自动装配之前,讲一个概念: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接口的对象,但是由于有多个符合这个条件的对象,所以无法实现帮你自动注入,因此会发生异常。解决的办法就好几种。我就不一一列举了,还是那句话,师傅领进门,修行靠个人,你应该自己去探索一下。

到此这篇关于Spring @Autowired实现自动装配的文章就介绍到这了,更多相关Spring @Autowired自动装配内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java——对象初始化顺序使用详解

    Java——对象初始化顺序使用详解

    本篇文章介绍了,Java对象初始化顺序的使用。需要的朋友参考下
    2017-04-04
  • SpringSecurity 表单登录的实现

    SpringSecurity 表单登录的实现

    本文主要介绍了SpringSecurity 表单登录的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • 微服务间调用Retrofit在Spring Cloud Alibaba中的使用

    微服务间调用Retrofit在Spring Cloud Alibaba中的使用

    这篇文章主要为大家介绍了微服务间调用Retrofit在Spring Cloud Alibaba中的使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Java基于Swing和netty实现仿QQ界面聊天小项目

    Java基于Swing和netty实现仿QQ界面聊天小项目

    这篇文章主要为大家详细介绍了Java如何利用Swing和netty实现仿QQ界面聊天小项目,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-09-09
  • 一文搞清楚Spring事务

    一文搞清楚Spring事务

    Spring事务是指在Spring框架中对于数据库操作的一种支持,它通过对一组数据库操作进行整体控制来保证数据的一致性和完整性。本文介绍Spring事务介绍的非常详细,有需要的朋友可以参考本文
    2023-04-04
  • Java 锁粗化与循环问题

    Java 锁粗化与循环问题

    这篇文章主要介绍了Java 锁粗化与循环的相关知识,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-04-04
  • Spring security认证两类用户代码实例

    Spring security认证两类用户代码实例

    这篇文章主要介绍了Spring security认证两类用户代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • 详解Java如何优雅的实现字典翻译

    详解Java如何优雅的实现字典翻译

    当我们在Java应用程序中需要对字典属性进行转换返回给前端时,如何简单、方便、并且优雅的处理是一个重要问题。在本文中,我们将介绍如何使用Java中的序列化机制来优雅地实现字典值的翻译,从而简化开发
    2023-04-04
  • 如何通过XML方式配置AOP过程解析

    如何通过XML方式配置AOP过程解析

    这篇文章主要介绍了如何通过XML方式配置AOP过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java基于享元模式实现五子棋游戏功能实例详解

    Java基于享元模式实现五子棋游戏功能实例详解

    这篇文章主要介绍了Java基于享元模式实现五子棋游戏功能,较为详细的分析了享元模式的概念、功能并结合实例形式详细分析了Java使用享元模式实现五子棋游戏的具体操作步骤与相关注意事项,需要的朋友可以参考下
    2018-05-05

最新评论