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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!