【SpringBoot】注解属性注入——图解三种配置方式

引入

这里有一个jdbc.properties配置文件:

jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/loliDB
jdbc.username=root
jdbc.password=123456

如何配置出一个数据连接池的Bean呢?

<!-- 加载外部资源资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!-- DataSource数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

emmmmm…没什么问题。接着往下看。

 
 

Spring配置的历史

xml配置?注解配置?谁才是历史的选择?我们不妨来回顾一下关于Spring配置的历史:

  • Spring1.0时代
    jdk1.5刚刚发布,注解开发并未为人们所熟知,因此一切配置都是xml。想象一下,铺天盖地的xml文件,铺天盖地的bean标签…
  • Spring2.0时代
    Spring此时已经引入了注解开发,但尚未完全完善。也就是说,注解配置并不能完全替代xml配置,所以人们都是两种混合使用。
  • Spring3.0时代及之后
    此时的注解开发已经非常完善,xml文件可以被完全删掉,Spring官方也推荐开发者使用全注解配置。SpringBoot来临后,基本宣告xml配置方式已经缓期死刑。

开发者应该对新事物保持追求,敢于抛弃历史遗留物。因此,无论你对xml文件有着多么深厚感情,我还是推荐你尽快玩转注解。

 
 

Spring注解配置全图解

在这里插入图片描述

 
 

1-通过新注解彻底摆脱xml

在学习Spring的时候我们就知道,使用原始注解无法彻底删除xml文件。因此又引入了诸多新注解。

具体的思路是:将一个类指定为配置类并加载资源文件,将资源文件的一个个配置参数通过 @Value注解 注入到类中的成员变量上,从而得以在配置类中使用资源文件的配置参数,并最终配置好一个连接池Bean对象。

注解说明
@Configuration标明这是一个Spring配置类
@PropertySource用于加载资源文件
@Bean被标注的返回值会直接被放到Spring容器中
@Value原始注解,用于属性注入

代码:

JdbcConfig配置类 ----------------------------------------------------------------------------

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {

    @Value("${jdbc.driverClassName}")
    String driverClassName;
    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}

 
 

2-将properties资源文件转化为Properties资源类

上一种使用@Value注入属性的方式有个缺点,那就是只能注入基本数据类型。SpringBoot提供了一种更新的、更强大的配置方式。

具体的思路是:使用 @ConfigurationProperties注解 将一个类指定为属性读取类(也可以叫资源类,该类就成为了application.properties/application.yml资源文件的翻版),再使用 @EnableConfigurationProperties注解 在配置类上引入刚刚的资源类,接着使用set(get())的方式进行Bean对象的配置。

另外注意,资源类默认读取的是application.properties/application.yml,不能再叫jdbc.propeties了。

JdbcProperties资源类 -----------------------------------------------------------------------

@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {

    private String driverClassName;
    private String url;
    private String username;
    private String password;

    // get/set方法省略,但必须要有
    // ...
}
JdbcConfig配置类 ----------------------------------------------------------------------------

@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {

	// jdbcProperties对象写在方法的参数里可直接使用(自动注入),在这里手动注入也可以
	// @Autowired 
	// private JdbcProperties jdbcProperties;

    @Bean
    public DataSource dataSource(JdbcProperties jdbcProperties) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(jdbcProperties.getDriverClassName());
        dataSource.setUrl(jdbcProperties.getUrl());
        dataSource.setUsername(jdbcProperties.getUsername());
        dataSource.setPassword(jdbcProperties.getPassword());
        return dataSource;
    }

}

 
 

3-根据对应关系将配置参数直接注入new出的对象

这种配置方式无比优雅与强大。

如果一组配置参数都是给一个Bean对象使用的,那么我们可以将资源文件写在方法上,SpringBoot会自动调用Bean对象的set方法,完成配置参数的注入。

具体的实现是:使用 @ConfigurationProperties注解 直接将资源文件写在方法上,@Bean返回的对象会自动完成参数注入。

JdbcConfig配置类 ----------------------------------------------------------------------------

@Configuration
public class JdbcConfig {

    @Bean
    @ConfigurationProperties(prefix = "jdbc")
    public DataSource dataSource() {
        return new DruidDataSource();
    }

}

 
 

补充:Relaxed binding(松散绑定)

上面的三种注解配置中,除了第一种(Spring新注解),第二种和第三种(SpringBoot提供)都支持松散绑定。那么,什么是松散绑定?

松散绑定即不严格要求资源文件中的属性名,与真正被注入的属性名完全一致。支持驼峰、中划线、下划线等等转换,甚至支持对象引导。

那么什么又是对象引导?

举个例子很容易明白。@Value注解仅支持简单属性的注入,比如用户的名字(user.name);对象引导则支持更加复杂的层级结构,比如用户的朋友的名字(user.friend.name)。

 
 

补充:所有的.properties资源文件可等价替换为.yml文件

认识YAML语言

上面的后两种注解注入方式(SpringBoot提供)中使用的application.properties文件,都可以等价替换为application.yml文件。下面,来进一步学习这种YAML语言。

YAML是一种结构清新简单的非标记语言。YAML之所以被称得上清新简单,是因为它使用空白、冒号、缩进、分行等方式组织数据。下面来直观感受一下吧:

jdbc:
  driverClassName: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/loliDB
  username: root
  password: 123456

YAML语法

1.树状的层级结构
2.缩进为2个空格
3.冒号后面必须加一个空格

4.如果是数组/集合等结构的数据,格式如下:
loli:
  name: Alice
  age: 12
  friend:
    - Mana
    - Hana

5.如果有多个yml文件,则要用application-xxx.yml命名,然后在application.yml中激活 
# 激活其他配置文件
spring:
  profiles:
    active: xxx,xxx

YAML规则

❶ SpringBoot允许多个yml文件,但这些文件的命名必须为 application-xxx.yml,并且要在 application.yml 中激活才能使用(如上)。

❷ 如果properties与yml同时存在于SpringBoot项目中,那么这两类文件都生效;如果存在同名的配置项,则以properties文件的为主。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

🍃 Spring

⭐️ Suki

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Spring Boot ,您可以使用 `@PostConstruct` 和 `@EventListener` 注解来实现属性注入成功后的回调事件。 示例代码如下: ```java @Component public class MyService { @Value("${my.property}") private String myProperty; @PostConstruct public void init() { // 在属性注入成功后执行 System.out.println("My property value is: " + myProperty); } @EventListener(ApplicationReadyEvent.class) public void onApplicationReady() { // 在应用启动完成后执行 System.out.println("Application is ready!"); } } ``` 在上面的示例,`@PostConstruct` 注解用于在属性注入成功后执行 `init()` 方法,而 `@EventListener` 注解用于在应用启动完成后执行 `onApplicationReady()` 方法。您可以根据您的需求在这些方法添加自己的业务逻辑。 ### 回答2: 在Spring Boot,当属性注入成功后,可以使用事件机制进行回调。具体步骤如下: 1. 创建一个自定义事件类,该类继承自ApplicationEvent,并在该类定义需要回调的方法。 ```java public class CustomEvent extends ApplicationEvent { public CustomEvent(Object source) { super(source); } // 定义需要回调的方法 public void callbackMethod() { // 处理自定义事件的逻辑 System.out.println("属性注入成功,执行回调方法"); } } ``` 2. 在需要进行回调的地方,使用ApplicationEventPublisher对象发布自定义事件。 ```java @RestController public class UserController { @Autowired private ApplicationEventPublisher applicationEventPublisher; @PostMapping("/user") public void createUser() { // 创建自定义事件对象 CustomEvent event = new CustomEvent(this); // 发布自定义事件 applicationEventPublisher.publishEvent(event); } } ``` 3. 创建一个事件监听器,该监听器实现ApplicationListener接口,并在onApplicationEvent方法进行事件的监听和处理。 ```java @Component public class CustomEventListener implements ApplicationListener<CustomEvent> { @Override public void onApplicationEvent(CustomEvent event) { // 获取事件源对象 Object source = event.getSource(); // 执行回调方法 if (source instanceof UserController) { UserController userController = (UserController) source; userController.callbackMethod(); } } } ``` 这样,在属性注入成功后,会触发自定义事件的发布,事件监听器会接收到该事件并执行回调方法,从而实现属性注入成功后的回调事件。 ### 回答3: Spring Boot 提供了一种方便的方式来注册属性注入成功后的回调事件。在应用程序的配置类上使用 `@ConfigurationPropertiesBinding` 注解,将属性绑定的转换器注册为一个 `Converter` bean,然后使用 `@PostConstruct` 注解将回调事件的处理方法标记为初始化方法。 首先,我们创建一个类来处理属性注入成功后的回调事件。在这个类,我们使用 `@ConfigurationPropertiesBinding` 注解属性绑定的转换器注册为一个 `Converter` bean,然后在 `@PostConstruct` 注解的方法处理回调事件。 ```java @Configuration public class PropertyCallbackConfig { @Bean public ConversionService conversionService() { DefaultConversionService conversionService = new DefaultConversionService(); conversionService.addConverter(new MyPropertyConverter()); return conversionService; } @Bean public PropertyCallbackHandler propertyCallbackHandler() { return new PropertyCallbackHandler(); } @ConfigurationPropertiesBinding public static class MyPropertyConverter implements Converter<String, MyProperty> { @Override public MyProperty convert(String source) { // 根据需要的逻辑进行属性转换 return new MyProperty(source); } } public static class MyProperty { private String value; public MyProperty(String value) { this.value = value; } // getter 和 setter 方法省略 } public static class PropertyCallbackHandler { @Autowired private MyProperty myProperty; @PostConstruct public void handlePropertyCallback() { // 属性注入成功后的处理逻辑 System.out.println("属性注入成功,值为:" + myProperty.getValue()); } } } ``` 在这个例子,`MyPropertyConverter` 类实现了 `Converter` 接口来进行属性转换,`MyProperty` 类用于存储属性的值。`PropertyCallbackHandler` 类使用 `@Autowired` 注解属性注入到 `myProperty` 字段,并使用 `@PostConstruct` 注解的方法来处理回调事件。 最后,我们需要在应用程序的启动类上使用 `@EnableConfigurationProperties` 注解来启用属性注入。 ```java @SpringBootApplication @EnableConfigurationProperties public class MyApplicaton { public static void main(String[] args) { SpringApplication.run(MyApplicaton.class, args); } } ``` 通过使用 Spring Boot 提供的这种方式,我们可以很方便地注册属性注入成功后的回调事件。当属性注入成功时,回调事件的处理方法将被自动调用,并可以在其进行需要的处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值