前言
关于IOC容器的依赖注入之前已写过三篇博文:
- IOC容器的依赖注入(DI)之基本实现为完全由beanx.xml文件来注入bean。
- Spring:IOC容器的依赖注入(DI)之自动装配Bean为自动装配bean,简化了beans.xml中的配置项。
- Spring:IOC容器的依赖注入(DI)之注解开发为补充记录IOC容器中常用的几个注解。
而本文意在使用配置类进行开发,完全取代beans.xml文件。
实现
导入dependency依赖
导入 spring-context
依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.13</version>
</dependency>
导入 Junit
依赖:
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
创建pojo
创建一个User类,并赋值
package com.langjialing.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class User {
@Value("langjialing")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
配置类
注:
- 配置类也会被Spring容器托管,注册到容器中。因为它本身就是一个
@Component
,通过@Configuration
注解实现。 @Configuration
代表这是一个配置类,与此前的beans.xml文件的功能是一致的。@ComponentScan("com.langjialing.pojo")
:指定扫描包的路径。@Import(MyConfig2.class)
: 当存在多个配置类时,相互引入配置类。@Bean
: 相当于bean.xml文件中的bean标签,方法的名字相当于bean标签的id属性,方法的返回值相当于bean标签的class属性。return new User();
:返回要注入到bean中的对象。
package com.langjialing.config;
import com.langjialing.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
//@Configuration也会被Spring容器托管,注册到容器中。因为它本身就是一个@Component
//@Configuration代表这是一个配置类,与此前的beans.xml文件的功能是一致的
@ComponentScan("com.langjialing.pojo") //扫描包
@Import(MyConfig2.class) //存在多个配置类时,相互引入配置类
public class MyConfig {
@Bean
//相当于bean.xml文件中的bean标签,方法的名字相当于bean标签的id属性,方法的返回值相当于bean标签的class属性
public User getUser(){
return new User(); //返回要注入到bean中的对象
}
}
测试类
注:
- 如果完全使用配置类的方式来注入bean,就只能通过 AnnotationConfig 上下文来获取容器,通过配置类的class对象加载。
import com.langjialing.config.MyConfig;
import com.langjialing.pojo.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MyTest {
@Test
public void user(){
// 如果完全使用配置类的方式来注入bean,就只能通过 AnnotationConfig 上下文来获取容器,通过配置类的class对象加载
ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
User getUser = context.getBean("getUser", User.class);
System.out.println(getUser);
}
}