spring 注解版 属性赋值 自动注入

spring的属性赋值,给一个bean的属性进行赋值,可以使用
@Value注解。
该注解可以注入基本数值,字符串什么的@Value("zhangsan"),也可以结合SpEL表达式@Value("#{18+1}"),还可以读取配置文件中的属性@Value("${person.nickname}")(person.nickname,是外部配置文件的一个属性名)。

Person.java(一个普通的bean)

package com.sixteen.entity;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;

@Data
public class Person {

    /**
     * @Value注解
     * 1. 基本数值都可注入
     * 2. SPEl表达式 #{}
     * 3. ${} 获取配置文件中的值
     */

    // 配置文件中的值默认加载进环境变量
    /**可以这样在环境中取出
     * ApplicationContext context = new AnnotationConfigApplicationContext(SpringPropertiesValueConfig.class);
     * Environment environment = context.getEnvironment();
     * String property = environment.getProperty("person.nickname");
     * System.out.println(property);
     */
    @Value("zhangsan")
    private String name;
    @Value("#{18+1}")
    private Integer age;

    @Value("${person.nickname}")
    private String nickename;
}

SpringPropertiesValueConfig.java(配置类)

package com.sixteen.config;

import com.sixteen.entity.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

//使用@PropertySource导入外部配置文件,在bean里用@Value注解(@Value("${person.nickname}"))进行属性赋值
@PropertySource(value = {"classpath:person.properties"})
@Configuration
public class SpringPropertiesValueConfig {

    @Bean
    public Person person(){
        return new Person();
    }
}

person.properties(外部配置文件)

person.nickname="xiaosan"

这样就可以给实体类(bean)的属性进行赋值了,在springboot中读取外部配置文件的值时,还可以使用@ConfigurationProperties,这个注解之后再详细说,也可以百度查询资料,不过一般用于需要赋值的属性过多时可以考虑,因为这一个注解就可以将所有属性赋值,而不像@Value需要在每个属性上加上。

自动注入(又被叫做DI注入)即在一个组件中如果想用另一个组件就可以注入想用的组件(因为spring接管了所有的bean和组件,所以想要用别的bean或者组件就得从IOC容器中获取)。
最典型的例子就是,在service层需要调用dao层方法(或者叫做mapper)这个时候就可以采用自动注入。

此时使用的配置文件和上面的配置文件不一样
SpringAutowiredConfig,java

package com.sixteen.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * @Autowired 自动注入
 *
 * @Autowired
 * private YyyMapper mapper;
 * 1) 默认按照类型去容器中找对应的组件,找到就赋值 context.getBean(SpringService.class);
 * 2) 如果找到多个相同类型的组件,再将属性的名称(mapper)作为组件id去容器查找 context.getBean("mapper")
 * @Qualifier(),传入bean的id,可以指定注入的bean,而不是用属性名
 *
 * 自动装配默认装配好,如果找不到组件,就报错
 * 也可以设置@Autowired(require=false),如果找不到装配的组件就不装配,也不会报错
 *
 * 可以使用@Primary注解,使装配首选为该bean,使用此注解时可再用@Qualifier()
 *  XxxService{
 *      YyyMapeer mapper;
 *  }
 */

@Configuration
@ComponentScan(basePackages = {"com.sixteen.service","com.sixteen.mapper"})
public class SpringAutowiredConfig {
}

SpringService.java(service层)

package com.sixteen.service;

import com.sixteen.mapper.SpringMapper;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SpringService {

    @Autowired
    private SpringMapper mapper;
}

SpringMapper.java

package com.sixteen.mapper;

import org.springframework.stereotype.Repository;

@Repository
public class SpringMapper {
}

一般情况这样注入是没问题的,但如果你想自动注入的组件/bean有多个在IOC容器时,那么就有可能注入的不是你所想要的,具体规则如下:

/**
 * @Autowired 自动注入
 *
 * @Autowired
 * private YyyMapper mapper;
 * 1) 默认按照类型去容器中找对应的组件,找到就赋值 context.getBean(SpringService.class);
 * 2) 如果找到多个相同类型的组件,再将属性的名称(mapper)作为组件id去容器查找 context.getBean("mapper")
 * @Qualifier(),传入bean的id,可以指定注入的bean,而不是用属性名
 *
 * 自动装配默认装配好,如果找不到组件,就报错
 * 也可以设置@Autowired(require=false),如果找不到装配的组件就不装配,也不会报错
 *
 * 可以使用@Primary注解,使装配首选为该bean,使用此注解时可再用@Qualifier()
 *  XxxService{
 *      YyyMapeer mapper;
 *  }
 */

像service层中属性这样写的话,@Autowired private SpringMapper mapper;,如果IOC容器中有不止一个SpringMapper这种组件,那么就会根据mapper这个临时起的属性名,作为bean的id去IOC容器中查找是否有组件,所以在必要时,一个属性的名称不要随意起变量名。

以上就是spring中属性赋值和自动注入的注解,如有不对,还望见谅,及时指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring中使用注解方式对属性进行动态赋值,主要使用的注解有以下几种: 1. `@Value` 注解 `@Value` 注解可以用来将配置文件中的属性注入到类的属性中。注解方式的格式为:`@Value("${属性名}")`。 例如,定义一个属性 `db.url` 并在配置文件中进行配置: ``` db.url=jdbc:mysql://localhost:3306/test ``` 在类中使用 `@Value` 注解将该属性注入到类的属性中: ``` @Component public class MyComponent { @Value("${db.url}") private String dbUrl; } ``` 2. `@ConfigurationProperties` 注解 `@ConfigurationProperties` 注解可以将配置文件中的属性注入到类的属性中,并且支持批量注入。使用该注解需要在类上加上 `@Component` 注解。 例如,在配置文件中定义了一个属性: ``` myconfig.name=John myconfig.age=20 ``` 在类中使用 `@ConfigurationProperties` 注解将该属性注入到类的属性中: ``` @Component @ConfigurationProperties(prefix="myconfig") public class MyConfig { private String name; private int age; // getter and setter methods } ``` 3. `@PropertySource` 注解 `@PropertySource` 注解可以用来加载指定的配置文件。使用该注解需要在类上加上 `@Configuration` 注解。 例如,定义一个配置文件 `app.properties`,并在类中使用 `@PropertySource` 注解加载该配置文件: ``` @Configuration @PropertySource("classpath:app.properties") public class AppConfig { // ... } ``` 然后在类中使用 `@Value` 注解将配置文件中的属性注入到类的属性中。 ``` @Component public class MyComponent { @Value("${db.url}") private String dbUrl; } ``` 以上就是Spring注解属性动态赋值的三种方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值