美文网首页
Spring 注解使用

Spring 注解使用

作者: lynnnnyl | 来源:发表于2022-10-13 15:15 被阅读0次

    常用注解

    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注解不好用在第三方类中。

    相关文章

      网友评论

          本文标题:Spring 注解使用

          本文链接:https://www.haomeiwen.com/subject/gfeburtx.html