jar包外进行配置文件的修改
在jar包的同目录创建application.properties文件,直接在这个文件中配置对应的信息,就可以完成对应的修改,我们就可以做到不修改源代码。
例子:
测试结果为下:
yml文件和properties文件都可以实现此功能,但必须保证这个配置文件的名字为application,才能生效。
条件注释
通过对应的条件判断完成对Bean的配置。
例子测试:
配置类
import com.huang.pojo.Cat;
import com.huang.pojo.Dog;
import com.huang.pojo.People;
import com.huang.pojo.User;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.context.annotation.Bean;
@SpringBootConfiguration
public class SpringbootConfig {
//条件注解测试
@Bean
public User getUser() {
return new User("tolen", 22);
}
@ConditionalOnClass(value = com.huang.pojo.User.class)
@Bean
public Dog getDog() {
return new Dog("haha", 1);
}
//此时是不会执行下面的方法
@ConditionalOnMissingClass(value = "com.huang.pojo.Dog")
@Bean
public Cat getCat() {
return new Cat("mimi", 2);
}
//因为在ioc容器中存在User,所以会执行
@ConditionalOnBean(value = User.class)
@Bean
public Cat getCat2() {
return new Cat("mimi", 2);
}
//因为在ioc容器中存在Cat,所以不会执行
@ConditionalOnMissingBean(value = Cat.class)
@Bean
public People getPeople() {
return new People("秃狼", 22);
}
}
启动类
import com.huang.pojo.Cat;
import com.huang.pojo.Dog;
import com.huang.pojo.People;
import com.huang.pojo.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication(scanBasePackages = "com.huang")
public class Springboot3StudyApplication {
public static void main(String[] args) {
//返回spring的ioc容器
var ioc = SpringApplication.run(Springboot3StudyApplication.class, args);
var cat = ioc.getBeanNamesForType(Cat.class);
if(cat != null) {
System.out.println("cat被创建");
System.out.println(cat[0]);
};
var dog = ioc.getBeanNamesForType(Dog.class);
if(dog != null) {
System.out.println("dog被创建");
System.out.println(dog[0]);
};
var people = ioc.getBeanNamesForType(People.class);
if(people != null) {
System.out.println("people被创建");
System.out.println(people[0]);
};
var user = ioc.getBeanNamesForType(User.class);
if(user != null) {
System.out.println("user被创建");
System.out.println(user[0]);
// 这里报错说数组的索引越界了,说明没有查到people,也就说明ioc容器中没有people的Bean
};
}
}
测试结果为下
这里报错说数组的索引越界了,说明没有查到people,也就说明ioc容器中没有people的Bean。
属性绑定注解
@ConfigurationProperties("前缀"): 声明组件的属性和配置文件哪些前缀开始项进行绑定。(配合@Compoment或@Bean使用)
@EnableConfigurationProperties:快速注册注解。(主要使用在外部引入的类上,因为外部类通常是没有注解扫描的,其上的注解是失效的,所以使用@EnableConfigurationProperties,使其类上的注解@ConfigurationProperties生效,这时就会和我们设置的配置文件中的信息绑定了。这个注解会自动将引入的文件配置到ioc容器中,无需添加@Bean)
例子
实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties("cat")
public class Cat {
private String name;
private Integer age;
}
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ConfigurationProperties("dog")
public class Dog {
private String name;
private Integer age;
}
配置类
import com.huang.pojo.Cat;
import com.huang.pojo.Dog;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
@SpringBootConfiguration
@EnableConfigurationProperties({Dog.class})
public class SpringbootConfig {
@Bean
public Cat getCat() {
return new Cat();
}
}
application.yml
cat:
name: mimi
age: 12
dog:
name: wangwang
age: 23
测试类
import com.huang.pojo.Cat;
import com.huang.pojo.Dog;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class Springboot3StudyApplicationTests {
@Autowired
Cat cat;
@Autowired
Dog dog;
@Test
void test1() {
System.out.println(cat);
System.out.println(dog);
}
}
测试结果为下: