常用注解
Spring中有三种配置方式:基于XML的配置、基于注解的配置、基于Java的配置。
使用原则:
1、Spring官方推荐使用基于Java的配置。Java配置通过@Configuration和@Bean实现。
2、Java配置与注解混合配置时,全局配置使用Java配置(如数据库相关配置、MVC相关配置),业务Bean的配置使用注解配置(@Service、@Component、@Repository、@Controller)
配置文件application.yml和application.properties
两者的语法不一样,yml配置文件呈树形结构,较好理解。如下所示:
person:
lastName: lee
age: 20
boss: false
birth: 1996/01/01
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhangsan
dog:
name: xiaogou
age: 12
properties文件的结构:
person.lastName=lee
person.age=20
person.boss=false
person.birth=1996/01/01
person.maps.k1=v1
person.maps.k2=12
person.lists[0]=lisi
person.lists[1]=zhangsan
person.dog.name=xiaogou
person.dog.age=12
注意事项:
1、yml以缩进分级,key: value形式赋值,注意冒号后面有一个空格;properties以 . 来赋值。
2、yml中缩进一定不能使用TAB,否则会报很奇怪的错误。
3、相比properties,yml对中文支持度更高。
4、当yml与properties配置文件同时存在时,先执行yml中的配置,再执行properties中的配置,对于同一变量,properties的配置会覆盖yml的配置。
ps:在线转换yml与properties的网址:https://www.toyaml.com/index1.html
@Configuration
---告诉Spring Boot,这是一个配置类==配置文件,写在配置类上面
---属性proxyBeanMethods表示是否代理bean,Spring Boot 2.0默认为true
Full(proxyBeanMethods=true)---没有组件依赖
Lite((proxyBeanMethods=false)---具有组件依赖,在配置文件中某个组件依赖于其它组件。
@Bean
配置类中使用@Bean标注在方法上,表示给容器注册组件,默认是单实例的。方法名(littleDog)是组件的id。返回类型是组件类型,返回值是组件在容器中的实例。
@Import
@Import({Person.class, DBHelper.class})给容器中自动创建这两个组件,放在类的最上面(即其它注解的前面)。
上述三个注解使用方法如下所示:
*1、配置类中使用@Bean标注在方法上给容器注册组件,默认是单实例的
*2、配置类MyConfig也是容器中的一个组件
*3、proxyBeanMethods: 代理bean的方法,springboot2.0默认为true
* Full(proxyBeanMethods=true)---config中没有组件依赖
* Lite(proxyBeanMethods=false)---config中有组件依赖
* 4、@Import({Person.class, DBHelper.class})给容器中自动创建这两个组件
*
**/
@Import({Person.class, DBHelper.class})
@Configuration // 告诉springboot这是一个配置类==配置文件
public class MyConfig {
@Bean //给容器添加组件,方法名(littleDog)是组件的id。返回类型是组件类型,返回值是组件在容器中的实例。
public Dog littleDog() {
return new Dog("littleDog");
}
@Bean("tomcat")
public Person littlePerson() {
return new Person("lynn");
}
}
@Conditional
条件装配:满足指定的条件,则进行组件注入。注解可以加在类和方法上,定义如下所示:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
从上面可以看出,需定义一个对象数组,且实现condition接口,如下所示:
@FunctionalInterface
public interface Condition {
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
condition接口中有一个matches方法,其中ConditionContext:判断条件能使用的上下文环境,AnnotatedTypeMetadata:注解所在位置的注释信息。在实现Condition接口时,需要重写matches方法来定义match规则。matches方法返回true则注入bean,false则不注入。SpringBoot有一些常用的@Conditional扩展注解。
[图片上传失败...(image-6bfb7d-1665645315545)]
我们也可以自定义实现Condition接口的类(例如:public class TestConditional implements Condition),然后使用@Conditional({TestConditional.class})注解实现自定义条件装配。
待补充例子。。。https://blog.csdn.net/xcy1193068639/article/details/81491071
@ImportResource
@ImportResource("classpath:beans.xml")导入spring的配置文件。
@ConfigurationProperties
@ConfigurationProperties+@Component配置绑定
读取配置文件,prefix = "person"
表示从配置文件中读取对应的person变量。但是需要配合@Component。使用@Component注解表示将组件注入容器,接下来才能使@ConfigurationProperties生效。具体使用如下图所示:
@Component
@Data
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
person:
lastName: lee
age: 20
boss: false
birth: 1996/01/01
maps: {k1: v1,k2: 12}
lists:
- lisi
- zhangsan
dog:
name: xiaogou
age: 12
@ConfigurationProperties+@EnableConfigurationProperties配置绑定
在配置文件MyConfig.java中加入@EnableConfigurationProperties(car.class),作用有两个:
1、开启Car配置绑定功能
2、把Car组件自动注入到容器中
这种配置绑定方式一般用在第三方库中,因为@Component注解不好用在第三方类中。
网友评论