Spring framework Day13:注解结合Java配置类

前言

前面我们管理 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。

  1. userService() 方法使用 @Bean 注解来声明一个名为 "userService" 的 Spring Bean,并将其返回。可以看到,在这里我们不需要编写 XML 配置文件,仅仅通过 Java 代码就可以完成 Bean 的装配。
  2. userController() 方法也使用 @Bean 注解来声明一个名为 "userController" 的 Spring Bean,并注入 "userService" Bean。在这个方法中,我们可以使用参数来实现依赖注入,也可以通过调用其他 Bean 方法来实现依赖注入。
  3. 此外,我们还使用 @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 容器工厂。具体来说,主要包含以下几个步骤:

  1. 创建基于注解和配置类的容器工厂

使用 AnnotationConfigApplicationContext 类来创建一个基于注解和配置类的 Spring 容器工厂。通过将 AppConfig.class 作为参数传入构造方法,指定了配置类的 Class 对象。

  1. 获取 Bean

通过调用容器工厂的 getBean() 方法,传入需要获取的 Bean 的类型 UserController.class,从而获取到名为 "userController" 的 Spring Bean。

  1. 使用 Bean

得到 Bean 之后,即可进行相关操作,这里调用了 add() 方法。

相比于传统的 XML 配置方式,在基于注解和配置类的方式下,上述三个步骤都荟萃在 Main 类中,更加简单明了。同时,由于使用注解,在代码中对 Bean 及其依赖关系进行了直接定义和维护,因此可以更加灵活地进行配置和管理。

运行结果

 

二、使用注解结合Java配置类的好处

使用注解结合Java配置类的好处有以下几点:

  1. 清晰明了:使用注解和Java配置类可以将配置信息直接写在代码中,使得配置与逻辑代码更加紧密,易于理解和维护。不再需要繁琐的XML配置文件,整个配置过程集中在一个类中,便于查找和管理。

  2. 类型安全:注解和Java配置类提供了类型安全的配置方式。通过使用注解,可以在编译时检查类型错误,减少运行时异常。同时,Java配置类使用Java代码进行配置,可以利用IDE的自动补全和编译时检查,提高开发效率。

  3. 灵活性:使用注解和Java配置类可以更方便地进行配置的修改和扩展。在Java配置类中,可以轻松地添加、删除或修改Bean的配置,而不需要修改XML文件并重新部署应用程序。此外,通过使用条件注解、属性注解等高级特性,可以根据不同的条件和环境进行动态的配置。

  4. 更好的测试支持:使用注解和Java配置类可以更方便地进行单元测试和集成测试。在测试时,可以轻松地创建和配置需要的Bean,重写特定的Bean定义,以模拟不同的场景和条件。

  5. 注解丰富:Spring Framework提供了丰富的注解,如@Autowired@Component@Value等,可以用于自动装配依赖、声明Bean、注入属性等。这些注解使得配置和开发更加简洁和便捷。

综上所述,使用注解结合Java配置类能够提高代码的可读性、可维护性和灵活性,减少了配置的复杂性,并支持更好的测试和开发体验。因此,注解和Java配置类已成为Spring框架中推荐的配置方式。

那么对比于 xml 大家更喜欢哪一种方式呢?

三、gitee 案例

案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值