欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring学习-自动装配

程序员文章站 2022-05-24 14:45:26
...

Spring自动配置的两个核心功能为:1.组件扫描;2.自动装配。

组件扫描就是指将@ComponentScan注解指定路径下的@Component,@Controller,@Service,@Repository,等注解标记的类注册到Spring上下文当中,这个过程假设所有的组件相互之间没有依赖。

但是现实不可能这么简单!缺少依赖关系的组件也很难实现有用的功能,因此自动装配的重要性也就显而易见,所谓自动装配是指利用@Autowired注解将已经扫描注册的bean注入到当前bean当中,用于构建更加复杂的bean。

需要注意的是,通常情况下,组件装配的时候,必须有唯一标识的bean存在,方可以注入到当前对象当中。

所谓唯一标识,包含两层意思。第一,至少存在一个该类型的bean实例;第二,已存在的该类型bean的实例,其名称不能冲突,需要区别开来。

1.项目结构

本项目所使用IDE为Idea,项目框架为Springboot,为了减少不必要的模板,项目采用lombok生产Getter和Setter等,项目文件结构如下所示。

├─src

│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─liguang
│  │  │          └─springboot
│  │  │              │  Config.java
│  │  │              │  SpringbootApplication.java
│  │  │              │
│  │  │              ├─CDplayer
│  │  │              │  └─soundSystem
│  │  │              │      ├─bean
│  │  │              │      │      CompactDisc.java
│  │  │              │      │      SgtPeppers.java
│  │  │              │      │
│  │  │              │      └─config
│  │  │              │              CDPlayerConfig.java
│  │  │              │
│  │  │              ├─knight
│  │  │              │  ├─bean
│  │  │              │  │      Knight.java
│  │  │              │  │
│  │  │              │  ├─config
│  │  │              │  │      KnightConfig.java
│  │  │              │  │
│  │  │              │  ├─controller
│  │  │              │  │      KnightController.java
│  │  │              │  │
│  │  │              │  └─dto
│  │  │              │          Minstrel.java
│  │  │              │
│  │  │              └─wizzard
│  │  │                  └─dto
│  │  │                          EvilWizzard.java
│  │  │
│  │  └─resources
│  │      │  application.properties
│  │      │  spring.xml

项目启动类为SpringBootApplication,本项目采用xml配置文件和JavaConfig注解两种方式混合配置。

2.xml配置定义bean

xml配置文件中定义了一个bean:EvilWizzard.class

package com.liguang.springboot.wizzard.dto;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

import java.util.List;
import java.util.Set;

@Setter
@Getter
@ToString
public class EvilWizzard {
    // string类型的set
    private Set<String> magic;
    // string类型的list
    private List<String> weapons;
    // string类型
    private String sex;
    // int类型
    private int age;
}

为了验证不同类型变量的注入方式,该bean包含了set,list,string,int等几种类型变量,xml配置文件为spring.xml,内容如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="evilWizard" class="com.liguang.springboot.wizzard.dto.EvilWizzard">
        <property name="age" value="500"/>
        <property name="sex" value="male"/>
        <property name="weapons">
            <list>
                <value>sword</value>
                <value>Broom</value>
            </list>
        </property>
        <property name="magic">
            <set>
                <value>change weather</value>
                <value>call skeleton</value>
            </set>
        </property>
    </bean>
</beans>

3.JavaConfig配置定义bean

为了将xml配置文件引入到JavaConfig配置文件,需要使用@ImportResource注解,其属性locations指定了spring.xml配置文件的位置。

package com.liguang.springboot.knight.config;

import com.liguang.springboot.knight.dto.Minstrel;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;

@Configuration
@ImportResource(locations = "classpath:spring.xml")
public class KnightConfig {
    
    @Bean(value = "minstrel")
    public Minstrel minstrel() {
        Minstrel minstrel = new Minstrel(System.out);
        minstrel.setId(1);
        return minstrel;
    }
}

*配置类为com.liguang.springboot.Config,该配置类导入上述配置类,汇总所有配置。

4.Controller结构

package com.liguang.springboot.knight.controller;

import com.liguang.springboot.knight.bean.Knight;
import com.liguang.springboot.knight.dto.Minstrel;
import com.liguang.springboot.CDplayer.soundSystem.bean.SgtPeppers;
import com.liguang.springboot.wizzard.dto.EvilWizzard;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/knight")
public class KnightController {

    @Autowired
    Minstrel minstrel;

    @Autowired
    Knight knight;

    @Autowired
    SgtPeppers sgtPeppers;

    @Autowired
    EvilWizzard evilWizzard;

    @RequestMapping("/quest")
    public String quest() {
        System.out.println(knight);
        minstrel.singBeforeQuest();
        minstrel.singAfterQuest();
        sgtPeppers.play();
        return evilWizzard.toString();
    }

}

为了测试bean组件能够成功装配,创建一个controller,将各个bean注入,运行项目,可以查看结果:http://localhost:8080/knight/quest

输出内容为:EvilWizzard(magic=[change weather, call skeleton], weapons=[sword, Broom], sex=male, age=500)

本项目GitHub地址,欢迎有兴趣的同学关注:点击打开GitHub链接