注解
@Configuration
- 配置类
//配置类本身也是组件
//Configuration(proxyBeanMethods=true)
//proxyBeanMethods:代理bean方法,默认为true
@Configuration
public class MyConfig{
//给容器添加组件,默认以方法名作为组件id,返回类型作为组件类型,返回值就是组件在容器中的实例
//默认单实例
@Bean("user")
public User user(){
return new User();
}
}
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class,args);
//查看容器的组件
String[] names = run.getBeanDefinitionName();
for(String name:names){
System.out.println(name);
}
//从容器中获取组件
User user1 = run.getBean("user",User.class);
User user2 = run.getBean("user",User.class);
System.out.println(user1==user2);
MyConfig bean = run.getBean(MyConfig.class)
System.out.println(bean);
//如果Configuration(proxyBeanMethods=true),springboot总会检查内部的组件是否在容器中
//如果在容器中就不会重新生成
//组件依赖时设置为true,保证组件唯一
User user3 = bean.user();
System.out.println(user1==user3);
}
}
@Import
- @Import({User.class})
- 给容器中导入组件
- 默认组件名是全类名
@Configuration
@Import({User.class});
public class MyConfig{
@Bean("user")
public User user(){
return new User();
}
}
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
//返回IOC容器
ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class,args);
String[] beanNamesForType = run.getBeanNamesForType(User.class);
for(String s : beanNamesForType){
System.out.println(s);
}
}
}
@Conditional
- 条件装配
- ConditionalOnBean
- 有对应组件才装配
- ConditionalOnMissingBean
- 没有对应组件才装配
- ConditionalOnBean
@Configuration
@Import({User.class});
@ConditionalOnBean(name="xxx")//容器中没有xx时所有都步装配
public class MyConfig{
@Bean("user")
//当容器中存在tom组件时装配user组件
@ConditionalOnBean(name="tom")
public User user(){
return new User();
}
@Bean("tom")
public User user(){
return new User();
}
}
@ImportResource
- 原生配置文件导入
- 老项目迁移(使用配置文件的系统迁移)
@ConfigurationProperties
-
配置绑定
-
application.properties
mycar.brand=byd
mycar.price=400
//只有在容器中的组件才能使用
@Component
@ConfigurationProperties(prefix="mycar")
public class Car{
private String brand;
private Integer price;
//get set方法
}
@Autowired
Car car;
- 第二种导入方法
- EnableConfigurationProperties
//必须在配置类中
//开启配置绑定
//导入容器
@EnableConfigurationProperties(Car.class)
@Configuration
public class MyConfig{
}
@ConfigurationProperties(prefix="mycar")
public class Car{
private String brand;
private Integer price;
//get set方法
}
- 如果需要获取大量的配置信息,可以用@ConfigurationProperties
- 如果只需要少部分值,仅需要@Value(“xxx”)
JSR303数据校验
@Component
@ConfigurationProperties(prefix="person")
//数据校验
@Validated
public class Person{
private String name;
private Integer age;
//校验邮箱地址
@Email(message="xxx")
private String email;
}
- @Notnull
- 验证对象是否不为null,无法检査长度为0的字符串
- @Null
- 验证对象是否为null
- @AssertTrue
- 验证 Boolean对象是否为true
- @AssertFalse
- 验证 Boolean对象是否为false
- @Max(value)
- 验正Number和String对象是否小于等于指定的值
- @Min(value)
- 验正Number和String对象是否大于等于指定的值
- @DecimalMax(value)
- 被标注的值必须不大于约束中指定的最大值,小数存在精度
- @DecimalMin(value)
- 被标注的值必须不小于约束中指定的最小值,小数存在精度
- @Digits(integer, fraction)
- 验证字符串是否是符合指定格式的数字,Interger指定整数精度,fraction指定小数精度
- @Size(min, max)
- 验证对象(Array、Collection、Map、String)长度是否在给定的范围之内
- @Past
- 验证Date和 Calendar对象是否在当前时间之前
- @Future
- 验证Date和 Calendar对象是否在当前时间之后
- @Pattern
- 验证 String对象是否符合正则表达式的规则
- @NotBlank
- 检查约束字符串是不是Null,被Trim的长度是否大于0。只对字符串,且会去掉前后空格
- @URL
- 验证是否是合法的url
- @Email
- 验证是否是合法的邮件地址
- @CreditCardNumber
- 验证是否是合法的信用卡号码
- @Length(min, max)
- 验证字符串的长度必须在指定的范围内
- @NotEmpty
- 检査元素是否为NULL或者 EMPTY。用于Array、Collection、Map、 String
- @Range(min, max, message)
- 验证属性值必须在合适的范围内