前言
前面我们管理 bean 都是在 xml 文件中去管理,本次我们将介绍如何在 Java 配置类中去管理 bean。
注解结合 Java 配置类是一种常见的 Spring 注入 Bean 的方式。通常情况下,开发人员会使用 Java Config 来定义应用程序的配置信息,而在 Java Config 中使用注解来声明和注入 Bean。
@Configuration
、@ComponentScan
和 @Bean
是 Spring Framework 中的常用注解,用于配置和创建 Bean。
@Configuration
注解标识一个类为配置类,相当于以前的 XML 配置文件。通常在该类中定义了一些用于创建和组装 Bean 的方法。
@ComponentScan
注解用于自动扫描指定包及其子包中的组件(包括注解为@Component
、@Service
、@Repository
、@Controller
等的类),并注册为 Spring 上下文中的 Bean。
@Bean
注解用于声明一个方法,该方法将返回一个对象,该对象将被注册为 Spring 上下文中的 Bean。@Bean
注解可以用在@Configuration
类中的方法上,也可以用在普通的@Component
类中的方法上。
一、开始学习
1、新建项目,结构如下
2、添加 spring 依赖
<!-- spring 的核心依赖 -->
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.4.5</version>
</dependency>
</dependencies>
3、在 service 包下新建一个 UserService 接口,在 impl 包下新建一个 UserServiceImpl 实现类
UserService 接口
public interface UserService {
void add();
}
UserServiceImpl 实现类
@Slf4j
public class UserServiceImpl implements UserService {
@Override
public void add() {
log.info("添加用户");
}
}
4、在 controller 包下新建一个 UserController 类
@RequiredArgsConstructor
public class UserController {
/**
* 通过构造方法注入 UserService
*/
private final UserService userService;
public void add() {
userService.add();
}
}
5、在 config 包下新建一个 AppConfig 配置类
/**
* @Date 2023-10-07
* @Author qiu
* <p>
* spring 提倡使用注解和配置类来完成 bean 的装配,
* 而配置类就是全面取代 xml 配置文件的一种方式
*/
@Configuration
@ComponentScan(basePackages = "edu.nf.ch13")
public class AppConfig {
/**
* * @Configuration注解:标识一个类为合法的配置类
* *
* * @ComponentScan注解:用于扫描指定的包,装配相关的 bean
* * 等价于 xml 中的扫描
* *
* * @Respository注解来装配 bean 以外,还可以使用
* *
* * @Bean 注解在配置类中装配 Bean,这种方式很类似
* * 在 xml 中配置一个个的 <bean id="xxx"/>
* * 用了 @Bean 注解后默认标注的方法名就是 Bean 的 id
* <p>
* 还可以通过 name 属性指定 bean 的别名
*
* @return
*/
@Bean
public UserService userService() {
return new UserServiceImpl();
}
/**
* 当需要注入其他 bean 的时候,有两种方式
* 方式一:通过参数实现注入
* 方式二:通过调用 bean 方法来实现注入
*
* @Scope:还可以声明在 Bean 方法上来设置 Bean 的作用域
* @return
*/
@Bean
@Scope("prototype")
public UserController userController() {
return new UserController(userService());
}
}
这是一个使用 Java 配置类来装配 Spring Bean 的示例代码。
在这个示例中,
@Configuration
注解表示AppConfig
类是一个合法的配置类。@ComponentScan
注解用于扫描指定包中的组件,并将其装配为 Spring Bean。
userService()
方法使用@Bean
注解来声明一个名为 "userService" 的 Spring Bean,并将其返回。可以看到,在这里我们不需要编写 XML 配置文件,仅仅通过 Java 代码就可以完成 Bean 的装配。userController()
方法也使用@Bean
注解来声明一个名为 "userController" 的 Spring Bean,并注入 "userService" Bean。在这个方法中,我们可以使用参数来实现依赖注入,也可以通过调用其他 Bean 方法来实现依赖注入。- 此外,我们还使用
@Scope
注解来设置UserController
Bean 的作用域为原型(prototype),以确保每次调用userController()
方法都会创建一个新的实例。总体来说,使用 Java 配置类来装配 Spring Bean 比起 XML 配置文件更加直观、方便,也更利于代码维护和易读性。
注意了!!!这个配置类就已经代替了 xml 文件,所以就不需要再去写 xml 文件了。还有我们之前都是通过使用特定注解(@Seivice、@Controller)去声明一个 Bena,现在也不需要写了,因为在配置文件中使用了 @Bean 去声明,大家自行选择使用。
6、测试
public class Main {
public static void main(String[] args) {
// 创建基于注解和配置类的容器工厂
// 取代 ClassPathXmlApplicationContext
// 构造方法指定配置类的 Class 对象
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserController bean = context.getBean(UserController.class);
bean.add();
}
}
这段代码展示了如何使用基于注解和配置类的 Spring 容器工厂。具体来说,主要包含以下几个步骤:
- 创建基于注解和配置类的容器工厂
使用
AnnotationConfigApplicationContext
类来创建一个基于注解和配置类的 Spring 容器工厂。通过将AppConfig.class
作为参数传入构造方法,指定了配置类的 Class 对象。
- 获取 Bean
通过调用容器工厂的
getBean()
方法,传入需要获取的 Bean 的类型UserController.class
,从而获取到名为 "userController" 的 Spring Bean。
- 使用 Bean
得到 Bean 之后,即可进行相关操作,这里调用了
add()
方法。
相比于传统的 XML 配置方式,在基于注解和配置类的方式下,上述三个步骤都荟萃在 Main 类中,更加简单明了。同时,由于使用注解,在代码中对 Bean 及其依赖关系进行了直接定义和维护,因此可以更加灵活地进行配置和管理。
运行结果
二、使用注解结合Java配置类的好处
使用注解结合Java配置类的好处有以下几点:
清晰明了:使用注解和Java配置类可以将配置信息直接写在代码中,使得配置与逻辑代码更加紧密,易于理解和维护。不再需要繁琐的XML配置文件,整个配置过程集中在一个类中,便于查找和管理。
类型安全:注解和Java配置类提供了类型安全的配置方式。通过使用注解,可以在编译时检查类型错误,减少运行时异常。同时,Java配置类使用Java代码进行配置,可以利用IDE的自动补全和编译时检查,提高开发效率。
灵活性:使用注解和Java配置类可以更方便地进行配置的修改和扩展。在Java配置类中,可以轻松地添加、删除或修改Bean的配置,而不需要修改XML文件并重新部署应用程序。此外,通过使用条件注解、属性注解等高级特性,可以根据不同的条件和环境进行动态的配置。
更好的测试支持:使用注解和Java配置类可以更方便地进行单元测试和集成测试。在测试时,可以轻松地创建和配置需要的Bean,重写特定的Bean定义,以模拟不同的场景和条件。
注解丰富:Spring Framework提供了丰富的注解,如
@Autowired
、@Component
、@Value
等,可以用于自动装配依赖、声明Bean、注入属性等。这些注解使得配置和开发更加简洁和便捷。
综上所述,使用注解结合Java配置类能够提高代码的可读性、可维护性和灵活性,减少了配置的复杂性,并支持更好的测试和开发体验。因此,注解和Java配置类已成为Spring框架中推荐的配置方式。
那么对比于 xml 大家更喜欢哪一种方式呢?
三、gitee 案例
案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git