Spring注解
下面描述Spring Boot注解,自己学习,仅供参考
只有在容器中的组件才会拥有SpringBoot的功能
@ConfigurationProperties(prefix = "xxx")为yml文件配置方式 @PropertySource(value="classpath:地址") 为properties文件配置方式
使用yml配置的方式:
@ConfigurationProperties(prefix = “person”) 配置绑定
1.定义一个Person对象,使用@Component将该对象添加到容器中;
2.@ConfigurationProperties(prefix = “person”)这个注解指定yml文件中的person方法(推荐)。
person对象(下图)
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
}
3.我们在测试类使用@Autowired自动装配person对象
测试类 (下图)
@SpringBootTest
class DemoApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
4 . 设置好属性值
yml文件(下图)
person:
name: zoutao
age: 2
happy: true
birth: 2020/03/03
maps: {k : k1,i : i1}
list:
-code
-music
-girl
使用properties配置的方式:
@PropertySource(value = “classpath:test.properties”)
加载指定配置文件(不推荐使用) person类(下图)
@PropertySource(value = "classpath:test.properties")
public class Person {
private String name;
private Integer age;
private Boolean happy;
private Date birth;
private Map<String,Object> maps;
private List<Object> list;
private Dog dog;
}
测试类 (下图)
@SpringBootTest
class DemoApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
application.properties (必须为这个名字)
person.name=tom
person.age=2
JSR303验证
@Validated 数据校验
使用下面验证方式必须写 @Validatedi
底层注解
@Configuration(proxyBeanMethods = true)
包含参数 proxyBeanMethods默认为true(可不写proxyBeanMethods),true是为单实例模式,false时会每调用一次组件创建一个对象;为什么有true或false的选择(解决组件依赖)。@Data
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class Dog {
private String name;
private Integer age;
}
@Bean注入
run.getBean(name,xx.class)获取组件 run.containsBean(组件名) 测试是否存在该组件@Configuration //告诉SpringBoot这是一个配置类
public class MyConfig {
@Bean
//给容器中添加组件,以方法名作为组件的id
//返回类型就是组件的类型,返回的值就是组件在容器中的实例
public Dog dog(){
return new Dog("ls",2);
}
}
主程序测试
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.example.demo")
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
ConfigurableApplicationContext run = SpringApplication.run(DemoApplication.class);
String[] Names = run.getBeanDefinitionNames();
for(String name : Names){
System.out.println(name);
}
}
}
@Import() 导入
给容器中自动创建导入类的组件,可导入多个用 { } 包起来。//在容器中自动创建两个类型的组件
@Import( { Dog.class , Person.class } )
//在容器中获取所有Bean
String beanNamesForType = run.getBeanNamesForType(Dog.class);
//打印出组件
for(String s : beanNamesForType ){
System.out.println(s);
}
@Conditional条件装配
满足Conditional的指定条件,则进行组件注入@ConditionalOnBean //仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
@ConditionalOnClass//某个class位于类路径上,才会实例化一个Bean。
@ConditionalOnExpression//当表达式为true的时候,才会实例化一个Bean。
@ConditionalOnMissingBean//仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean。
@ConditionalOnMissingClass//某个class类路径上不存在的时候,才会实例化一个Bean。
@ConditionalOnNotWebApplication//不是web应用,才会实例化一个Bean。
@ConditionalOnBean//当容器中有指定Bean的条件下进行实例化。
@ConditionalOnMissingBean//当容器里没有指定Bean的条件下进行实例化。
@ConditionalOnClass//当classpath类路径下有指定类的条件下进行实例化。
@ConditionalOnMissingClass//当类路径下没有指定类的条件下进行实例化。
@ConditionalOnWebApplication//当项目是一个Web项目时进行实例化。
@ConditionalOnNotWebApplication//当项目不是一个Web项目时进行实例化。
@ConditionalOnProperty//当指定的属性有指定的值时进行实例化。
@ConditionalOnExpression//基于SpEL表达式的条件判断。
@ConditionalOnJava//当JVM版本为指定的版本范围时触发实例化。
@ConditionalOnResource//当类路径下有指定的资源时触发实例化。
@ConditionalOnJndi//在JNDI存在的条件下触发实例化。
@ConditionalOnSingleCandidate//当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化。