Ioc介绍 几种注入方式

2023-12-20 20:23:00

Ioc介绍

1、原始方式配置文件

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

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

在这里插入图片描述

在测试方法中使用这个类

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);
    }
}

在这里插入图片描述

可以成功读取到内容

2、基于xml方式配置

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"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean class="org.example.xml.config.DataConfig" id="config">
        <property name="name" value="重口味"/>
        <property name="username" value="root"/>
        <property name="password" value="124212"/>
    </bean>
</beans>

在这里插入图片描述

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

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

在这里插入图片描述

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;
    }
}

在这里插入图片描述

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

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

在这里插入图片描述

自定义名称获取
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;
    }
}

在这里插入图片描述

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

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

在这里插入图片描述

通过包名获取

将下面的包名复制

在这里插入图片描述

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

刚刚复制的包名,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);
}

在这里插入图片描述

扫包+注解方式

为了测试看着方便,将刚刚的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;
}

在这里插入图片描述

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);
}

在这里插入图片描述

直接在字段上赋值

在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;
}

在这里插入图片描述

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

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;
    // }
}

在这里插入图片描述

测试方法中创建

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

在这里插入图片描述

使用外部加载

不通过名称去取

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;
}

在这里插入图片描述

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

在这里插入图片描述

创建测试类

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

在这里插入图片描述

通过名称去取

名字要和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;
}

在这里插入图片描述

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取别名

在这里插入图片描述

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

测试通过

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_46533577/article/details/135105166
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。