可以理解为我们在Spring容器中所定义的Bean的逻辑组名称,只有当这些Profile被激活的时候,才会将Profile中所对应的Bean注册到Spring容器中。举个更具体的例子,我们以前所定义的Bean,当Spring容器一启动的时候,就会一股脑的全部加载这些信息完成对Bean的创建;而使用了Profile之后,它会将Bean的定义进行更细粒度的划分,将这些定义的Bean划分为几个不同的组,当Spring容器加载配置信息的时候,首先查找激活的Profile,然后只会去加载被激活的组中所定义的Bean信息,而不被激活的Profile中所定义的Bean定义信息是不会加载用于创建Bean的
使用@profile注解的目的是为了多环境开发,比如开发环境使用dev, 生产环境使用prod, 就可以使用@Profile注解实现不同的开发环境使用不同的数据源。
@profile注解 使用说明:
1. spring3.2之前 @Profile注解用在类上
2. spring3.2 之后 @Profile注解用在方法上
配置类:
@Configuration
public class MainConfig {
@Bean
@Profile("dev")
public Person devPerson() {
System.out.println("dev");
Person person = new Person();
person.setName("devPerson");
return person;
}
@Bean
@Profile("prod")
public Person prodPerson() {
System.out.println("prod");
Person person = new Person();
person.setName("prodPerson");
return person;
}
}
激活方式:
1. spring.profiles.active 激活方式
2. 如果 spring.profiles.active 未配置, 使用spring.profiles.default激活方式
3. 如果前面都未配置,就会加载没有定义在profile中的bean
spring在确定那个profile处于激活状态的时,需要依赖两个独立的属性:spring.profiles.active和spring.profile.default。如果设置了spring.profiles.actives属性,那么它的值就会用来确定那个profile是激活的。如果没有设置spring.profiles.active属性的话,那spring将会查找spring.profiles.default的值。
测试类:
public class MainClass {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
Person person = (Person) context.getBean(Person.class);
System.out.println("person-name : " + person.getName());
}
}
结果:
prod
person-name : prodPerson