Spring 注解使用

常用注解

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[] 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 maps;
    private List 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注解不好用在第三方类中。

你可能感兴趣的:(Spring 注解使用)