Ioc介绍 几种注入方式

Ioc介绍

1、原始方式配置文件

在文件中新建config包,里面写上配置文件所需要的内容

@Data
public class DataConfig {
    private String name;
    private String username;
    private String password;
}

Ioc介绍 几种注入方式_第1张图片

在测试方法中使用这个类

import org.example.xml.config.DataConfig;
import org.junit.Test;

public class AppTest {

    /**
     * 原始的方式读取配置文件,这样很繁琐
     */
    @Test
    public void demoTest() {
        DataConfig config = new DataConfig();
        config.setName("test");
        config.setUsername("root");
        config.setPassword("123");

        System.out.println(config);
    }
}

Ioc介绍 几种注入方式_第2张图片

可以成功读取到内容

2、基于xml方式配置

xml中配置相关属性名




    
        
        
        
    

Ioc介绍 几种注入方式_第3张图片

之后创建测试方法,使用反射机制创建对象,ClassPathXmlApplicationContext中填写你在resource下的xml文件。

/**
 * 使用xml配置进行读取文件
 */
@Test
public void demo2Test() {
    ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
    DataConfig config = context.getBean(DataConfig.class);
    System.out.println(config);
}

Ioc介绍 几种注入方式_第4张图片

3、基于注解

配置类

直接使用方法名获取

需要注意的是需要在类上加上@Configuration在方法上加上@Bean表示注入

import org.example.xml.config.DataConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
    @Bean
    public DataConfig dataConfig() {
        DataConfig config = new DataConfig();
        config.setName("一个名字");
        config.setUsername("root");
        config.setPassword("123456");
        return config;
    }
}

Ioc介绍 几种注入方式_第5张图片

使用这个配置,在测试方法中创建测试方法。

/**
 * 基于注解---配置类
 */
@Test
public void demo3Test() {
    ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
    Object config = context.getBean("dataConfig");// 这个是指类中方法名
    System.out.println(config);
}

Ioc介绍 几种注入方式_第6张图片

自定义名称获取
import org.example.xml.config.DataConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
    @Bean(value = "config")
    public DataConfig dataConfig() {
        DataConfig config = new DataConfig();
        config.setName("一个名字");
        config.setUsername("root");
        config.setPassword("123456");
        return config;
    }
}

Ioc介绍 几种注入方式_第7张图片

在测试方法中新建测试方法,将value的值放入getBean

/**
 * 基于注解---自定义方法名
 */
@Test
public void demo4Test() {
    ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
    Object config = context.getBean("config");// 这个是指类中方法名
    System.out.println(config);
}

Ioc介绍 几种注入方式_第8张图片

通过包名获取

将下面的包名复制

Ioc介绍 几种注入方式_第9张图片

在测试方法中新建测试方法,通过包名获取

刚刚复制的包名,getBean中传入的是之前在ApplicationConfig类下写的@Bean(value = "config")与这个对应

/**
 * 通过包名获取
 */
@Test
public void demo5Test() {
    ApplicationContext context = new AnnotationConfigApplicationContext("org.example.scanPack.config");
    Object config = context.getBean("config");
    System.out.println(config);
}

Ioc介绍 几种注入方式_第10张图片

扫包+注解方式

为了测试看着方便,将刚刚的DataConfig复制一份命名为DataConfig2,并且在上面加上@component

import lombok.Data;
import org.springframework.stereotype.Component;

@Data
@Component
public class DataConfig2 {
    private String name;
    private String username;
    private String password;
}

Ioc介绍 几种注入方式_第11张图片

ApplicationConfig方法中改成下面这种引入DataConfig2

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

@Configuration
public class ApplicationConfig {
    @Bean(value = "config")
    public DataConfig2 dataConfig() {
        DataConfig2 config = new DataConfig2();
        config.setName("一个名字");
        config.setUsername("root");
        config.setPassword("123456");
        return config;
    }
}

在测试方法中将包名添加进去

/**
 * 扫包方式加载
 */
@Test
public void demo6Test() {
    ApplicationContext context = new AnnotationConfigApplicationContext("org.example.scanPack.config");
    Object config = context.getBean("config");
    System.out.println(config);
}

Ioc介绍 几种注入方式_第12张图片

直接在字段上赋值

在Dataconfig中

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Data
@Component
public class DataConfig2 {
    @Value("名字111")
    private String name;
    @Value("root")
    private String username;
    @Value("123456")
    private String password;
}

Ioc介绍 几种注入方式_第13张图片

这个一定要注释掉否则会报错

import org.example.xml.config.DataConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ApplicationConfig {
    // @Bean(value = "config")
    // public DataConfig2 dataConfig() {
    //     DataConfig2 config = new DataConfig2();
    //     config.setName("一个名字");
    //     config.setUsername("root");
    //     config.setPassword("123456");
    //     return config;
    // }
}

Ioc介绍 几种注入方式_第14张图片

测试方法中创建

/**
 使用注解方式
 */
@Test
public void demo7Test() {
    ApplicationContext context = new AnnotationConfigApplicationContext("org.example.scanPack.config");
    DataConfig2 config2 = context.getBean(DataConfig2.class);
    System.out.println(config2);
}

Ioc介绍 几种注入方式_第15张图片

使用外部加载

不通过名称去取

DataConfig2注解到这个配置中,然后给上面字段赋值,会自动映射。

import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Data
@Component
public class GlobalConfig {
    @Value("新的名字")
    private String name;
    @Value("使用全局注解")
    private String username;
    @Value("密码")
    private String password;
    @Autowired
    private DataConfig2 config2;
}

Ioc介绍 几种注入方式_第16张图片

注意!!!此时ApplicationConfig仍为注释状态

Ioc介绍 几种注入方式_第17张图片

创建测试类

/***
 * 从外部引入
 */
@Test
public void demo8Test() {
    ApplicationContext context = new AnnotationConfigApplicationContext("org.example.scanPack.config");
    GlobalConfig config = context.getBean(GlobalConfig.class);
    System.out.println(config);
}

Ioc介绍 几种注入方式_第18张图片

通过名称去取

名字要和DataConfig一样

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Data
@Component("config")
public class DataConfig2 {
    @Value("名字111")
    private String name;
    @Value("root")
    private String username;
    @Value("123456")
    private String password;
}

Ioc介绍 几种注入方式_第19张图片

import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Data
@Component
public class GlobalConfig {
    @Value("新的名字")
    private String name;
    @Value("使用全局注解")
    private String username;
    @Value("密码")
    private String password;
    @Autowired
    @Qualifier("config")
    private DataConfig2 config2;
}

使用Qualifier取别名

Ioc介绍 几种注入方式_第20张图片

测试方法中还是用之前的测试方法

测试通过

Ioc介绍 几种注入方式_第21张图片

你可能感兴趣的:(java,java,spring,boot,后端,spring,ioc)