Spring 属性赋值相关注解

文章目录

  • 一、XML方式属性赋值
  • 二、@PropertySource+@Value属性赋值
  • 三、@Value
    • 1. 注入普通属性
    • 2. 注入配置文件中的属性
    • 3. 注入SpEl表达式并运算

一、XML方式属性赋值

// 加载配置文件
<context:property-placeholder location="classpath:person.properties" />
<bean id="person" class="com.lwk.bean.Person" init-method="init" destroy-method="destroy">
  <property name="age" value="18"></property>-->
  <property name="name" value="liayun"></property>-->
  <property name="nickName" value="${person.nickName}"></property>-->
</bean>

二、@PropertySource+@Value属性赋值

配置文件person.properties

person.nickName=小李四
使用@PropertySource读取外部配置文件中的key/value保存到运行的环境变量中,加载完外部的配置文件以后,使用${}取出配置文件中的值
@PropertySource(value={"classpath:/person.properties"})
@Configuration
public class MainConfigOfPropertyValues {
    @Bean
    public Person person() {
        return new Person();
    }
}
#{···}:用于执行SpEl表达式,并将内容赋值给属性
${···}:主要用于加载外部属性文件中的值, 配合配置文件@Configuration+@PropertySource(value={"classpath:/person.properties"})使用
${···}和#{···}可以混合使用,但是必须${}在里面,#{}在外面
public class Person {
    @Value("张三")
    private String name;
    @Value("#{20-2}")
    private Integer age;
    @Value("${person.nickName}")
    private String nickName;
}

还可以通过环境变量对象从配置文件中获取属性值

@Test
public void test01(){	
	AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfPropertyValues.class);			
	ConfigurableEnvironment environment = applicationContext.getEnvironment();
	String property = environment.getProperty("person.nickName");
	System.out.println(property);
	applicationContext.close();
}

三、@Value

@Value源码中的注释

  • 在字段或方法/构造函数参数级别使用的注释,用于指示注释元素的默认值表达式。通常用于基于表达式或属性的依赖注入。还支持动态解析处理程序方法参数。
  • 例如在Spring MVC中,常见用例是使用#{systemProperties.myProp}样式的SpEL(Spring表达式语言)表达式注入值。或者,可以使用${my.app.myProp}样式的属性占位符注入值。
  • 请注意,@Value注释的实际处理由BeanPostProcessor执行,这意味着不能在BeanPostProcessor或BeanFactoryPostProcessor类型中使用@Value。请查阅AutowiredAnnotationBeanPostProcessor类的javadoc(默认情况下会检查此注释的存在)。

1. 注入普通属性

@Value注解可以注入一些字段的普通属性,并且会自动进行类型转换

定义一个bean

@Component
@Data
public class ConnectionPool {
    @Value("jdbc:mysql://localhost:3306/test")
    private String url;
    @Value("com.mysql.jdbc.Driver")
    private String driveName;
    @Value("root")
    private String userName;
    @Value("root")
    private string password;
}

定义配置类,用于扫描bean

@Configuration
@ComponentScan("com.lwk.dao")
public class myConfig { }

测试

@Test
public void test01(){
    ApplicationContext context = new AnnotationConfigApplicationContext(myConfig.class);
    ConnectionPool connectionPool = context.getBean("connectionPool", ConnectionPool.class);
    System.out.println(connectionPool.toString());
}
ConnectionPool{url='jdbc:mysql://localhost:3306/test', driveName='com.mysql.jdbc.Driver', userName='root',password=10}

2. 注入配置文件中的属性

可以通过@Value(“${}”)来注入配置文件中的属性

@Component
@Data
public class ConnectionPool {
    @Value("jdbc:mysql://localhost:3306/test")
    private String url;
    @Value("com.mysql.jdbc.Driver")
    private String driveName;
    @Value("root")
    private String userName;
    @Value("${mysql.pwd}")
    private String password;
}

定义配置类,用于扫描bean

@Configuration
@ComponentScan("com.lwk.dao")
@PropertySource({"classpath:db.properties"}) 
public class myConfig { }

db.properties配置文件放在resources目录下,使用@PropertySource注解扫描的classpath就是此路径

mysql.password=root

测试

ConnectionPool{url='jdbc:mysql://localhost:3306/test', driveName='com.mysql.jdbc.Driver', userName='root', password='root'}

3. 注入SpEl表达式并运算

  • 当@Value包含一个SpEl表达式时,该值将在运行时动态计算
  • SpEl(Spring Expression Language ),是Spring的表达式语言,很多框架中都有自己的El表达式,Spring中El表达式支持的功能有很多,在官方文档里面有详细的介绍和用例。

动态获得运行机器的核心数作为参数注入

@Component
@Data
public class ConnectionPool {
    @Value("#{T(java.lang.Runtime).getRuntime().availableProcessors()}")
    private int minCons;
    @Value("#{T(java.lang.Runtime).getRuntime().availableProcessors() * 2}")
    private int maxCons;
}
ConnectionPool{minCons=8, maxCons=16}

你可能感兴趣的:(Spring,spring,java,spring注解)