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中属性赋值和自动注入的注解,如有不对,还望见谅,及时指正。