Spring框架学习之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自动装配内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java SpringBoot自动装配原理详解及源码注释

    目录 一.pom.xml文件 1.父依赖 2.启动器: 二.主程序: 剖析源码注解: 三.结论: 一.pom.xml文件 1.父依赖 主要是依赖一个父项目,管理项目的资源过滤以及插件! 资源过滤已经配置好了,无需再自己配置 在pom.xml中有个父依赖:spring-boot-dependencies是SpringBoot的版本控制中心! 因为有这些版本仓库,我们在写或者引入一些springboot依赖的时候,不需要指定版本! 2.启动器: 启动器也就是Springboot的启动场景; 比如sp

  • 基于Spring@Autowired注解与自动装配详谈

    1 配置文件的方法 我们编写spring 框架的代码时候.一直遵循是这样一个规则:所有在spring中注入的bean 都建议定义成私有的域变量.并且要配套写上 get 和 set方法. Boss 拥有 Office 和 Car 类型的两个属性: 清单 3. Boss.java package com.baobaotao; public class Boss { private Car car; private Office office; // 省略 get/setter @Override p

  • Spring使用@Autowired注解实现自动装配方式

    目录 Spring支持注解配置 引入注解依赖 启用注解 使用@Autowired注解实现自动装配 1.IOC容器配置 2.实体类使用@Autowired注解注入属性 3.测试结果 @Autowired注解的使用和注入规则 1.使用在变量域上面 2.@Autowired注解使用在构造器上面 Spring支持注解配置 引入注解依赖 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="ht

  • 聊聊SpringBoot自动装配的魔力

    目录 一. springBoot自动配置的好处 1. 回想一下当你在使用spring来搭建一个项目的时候 2.这时我们会有一个疑问 二.@Conditional注解相关介绍 1.@Conditional小demo 三.自定义一个条件配置类/springBoot自定义注解 1.简单解释@Condition注解家族 2.自定义条件注解 一. springBoot自动配置的好处 1. 回想一下当你在使用spring来搭建一个项目的时候 你需要编写很多的有关spring的xml.例如读取属性配置的bea

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

    学习自动装配之前,讲一个概念:Component,即组件.组件你也可以理解为bean对象,只不过通常Component的组成会稍微复杂一些,比如,一个组件里面会引用一个或多个别的bean对象,组件的定义方式也不一样.自动装配貌似就是为组件而生的. 自动装配(Autowired)这个概念,如果你已经使用过SpringMVC或者SpringBoot做开发,你会发现@Autowired注解是特别经常使用到的.比如你的Controller.Service相关的类里面就会经常用到.如果你看过@Contro

  • Spring框架学习常用注解汇总

    目录 类注解 方法或属性上注解 参数注解 类注解 @component 标注类,泛指各种组件,类不属于各种分类的时候,用它做标注. @Service 标注类,声明该类为业务层组件,用于处理业务逻辑 @Repositor 标注类,声明该类为持久层的接口.使用后,在启动主程序类上需要添加@MapperScan("xxx.xxx.xxx.mapper")注解 @Mapper 标注类,用在持久层的接口上,注解使用后相当于@Reponsitory加@MapperScan注解,会自动进行配置加载

  • Spring框架学习之AOP详解

    一.概念 1.面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率. 2.通俗描述:不通过修改源代码方式,在主干功能里面添加新功能 二.底层原理:动态代理 有两种情况动态代理 2.1 有接口, JDK 动态代理 1.被代理的对象 public class UserDaoImpl implements UserDao { @Override public int add(int a, int b) {

  • Spring框架学习之Cache抽象详解

    目录 1.简介 cache和buffer 2.缓存抽象 3.spring缓存抽象与多进程 官方文档  8.0 Spring为不同缓存做了一层抽象,这里通过阅读文档以及源码会对使用以及原理做一些学习笔记. 1.简介 从3.1版开始,Spring Framework提供了对现有Spring应用程序透明地添加缓存的支持. 与事务支持类似,缓存抽象允许一致地使用各种缓存解决方案,而对代码的影响最小. 从Spring 4.1开始,通过JSR-107注释和更多自定义选项的支持,缓存抽象得到了显着改进. ca

  • Java Spring框架简介与Spring IOC详解

    目录 Spring简介和配置 1.Spring概述 1.1 spring 是什么 1.2 Spring发展历程 1.3 Spring的优势 (理解) \1. 方便解耦,简化开发 \2. AOP 编程的支持 \3. 声明式事务的支持 \4. 方便程序的测试 \5. 方便集成各种优秀框架 \6. 降低 JavaEE API 的使用难度 \7. Java 源码是经典学习范例 1.4 Spring的体系结构(了解) 2.Spring IoC快速入门 2.1 IoC的概念和作用 2.2 Spring Io

  • spring IOC容器的Bean管理XML自动装配过程

    目录 什么是自动装配? 自动装配过程 1. 创建 2 个类 2. 配置文件 3. 测试方法 什么是自动装配? 在之前的内容中,每给属性注入值都要一个个的用 property 标签来完成,比如: <bean id="book" class="com.pingguo.spring5.collectiontype.Book" scope="prototype"> <property name="list" ref=

  • spring框架学习总结

    目录 Spring 框架概述 Spring优点 Spring体系结构 Spring拓展 Spring Boot与Spring Cloud Spring IoC 容器 (IoC 也称为依赖项注入(DI),或DI是实现IoC的一种方法) IoC容器概述 Spring入门程序 IoC创建对象的三种方式 通过无参构造(要提供set方法) 通过有参构造(要提供get方法) 通过工厂类 Spring依赖注入(DI)和Bean的作用域 Spring 常用配置及属性 Spring自动装配 Spring注解开发

  • SpringBoot特点之依赖管理和自动装配(实例代码)

    1.1依赖管理 父项目做依赖管理 自动版本仲裁:在父项目里规定了依赖的版本,只需要引入以来即可,不需要写版本号 依赖管理 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.4.RELEASE</version> </parent>

  • Spring如何基于注解显式实现自动装配

    构建bean文件: public class People { private String name = "小明"; } 编写配置类: @Configuration @Import(ApplicationConfig2.class) public class ApplicationConfig { @Bean public People getPeople(){ return new People(); } } @configuration:说明这是一个配置类,功能几乎等同于<

  • Spring 自动装配的二义性实例解析

    这篇文章主要介绍了Spring 自动装配的二义性实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.我们知道可以用Spring的自动装配(@Autowired)将Bean应用注入到构造参数和属性中,但是,注意了,仅有一个bean匹配需要的结果时,自动装配才可以生效.如果有多个bean匹配同一个结果,这种歧义性会阻碍Spring自动装配属性,构造参数或方法参数. 大白话说一下,就如我们有一个甜片接口(Dessert)里面有一个好吃的方法(

随机推荐