欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring注解汇总

程序员文章站 2022-07-08 14:39:37
...

Spring注解汇总

Spring中注解一览:

导入组件

  • @Configuration

    告诉Spring这是一个配置类,相当于原来的.xml或者.properties配置文件

  • @Bean

    相当于原来.xml文件中的标签,代表向容器中注入一个JavaBean,该注解作用在方法上,方法的返回值代表Bean的类型,方法名(或者注解的属性)代表Bean的id.

    可以在注解中指定该Bean的初始化方法和销毁方法:@Bean(initMethod="", destoryMethod="")这样在容器给我们创建bean的时候就会执行对应的方法.

    除了注解,如果我们要注册的Bean实现了InitializingBean接口和DisposableBean接口,那么在创建完对象以后会执行对应的初始化方法,我们可以自定义初始化和销毁的逻辑.

  • @ComponentScan

    扫描注解,作用在类上,只要扫描的路径下的类上标注了@Service、@Controller、@Repository等注解就可以扫描到,作用和原来xml文件中包扫描的标签一致.

    该注解的属性中,value指定要扫描的包;excludeFilters指定扫描的时候排除的元素,该属性是一个数组,可以指定多个.

    ep:

    @ComponentScan(value = 'com.xiaojian', excludeFilters = {
        @Filter(type=FilterType.ANNOTATION,
               classes={Controller.class, Service.class})
    })
    

    以上代码中表示在包扫描的时候排除Controller注解和Service注解标注的类.

    该注解还有一个属性includeFilters,指定扫描的时候只包含什么组件.

  • @ComponentScans

    该注解可以包含多个@ComponentScan注解,可以自己组合使用.

  • @Scope

    设置bean的作用域,在spring中,默认获得的JavaBean是单实例的,如果我们要改变这种规则,可以使用此注解来设置,取值有四种:prototypesingletonrequestsession,其中prototype表示多实例,singleton表示单实例,也就是默认情况.request表示同一次请求创建一个实例,session同一个session创建一个实例.

    需要知道的是,如果是单实例情况,那么在容器启动的时候,spring就已经帮我们创建好了实例对象并放在IOC容器中,如果是prototype多实例,是在每次获取的时候创建对象,且每次调用都创建一个.

  • @Lazy

    懒加载.spring创建对象是单实例的,默认是在容器启动的时候就创建好了对象,如果我们使用此注解,就可以在获取对象的时候才创建,这样子在IOC容器初始化的时候就不会帮我们创建对象了.

  • @Conditional

    按照一定的条件进行判断,满足条件才给容器中注册bean

    这个注解是spring4.0后给我们提供的,在springboot中使用比较频繁,可以使用在类上,也可以使用在方法上.

    该注解的参数需要传Condition,Condition是一个接口,有一个方法matches,返回值是boolean类型,true代表匹配成功,false代表不匹配,我们只需要自定义Condition的实现类即可.

    matches方法有两个参数:ConditionContextAnnotatedTypeMetadata,前者表示判断条件能使用的上下文环境对象,后者表示注释信息.

    如果该注解放在类上,那么只有当满足条件的时候,当前类中配置的所有bean才会注册.

  • @Import

    快速给容器中注册一个组件,注册的id默认是全类名

    也可以在该注解中以数组的方式导入多个组件.

    @Import({"com.xxx.xx", "com.xxx.xxxx"})
    

    除了指定具体的导入类,也可以使用自定义的逻辑筛选来导入,即在该注解中指定属性ImportSelector,ImportSelector是一个接口,它有一个方法selectImports(),返回值是一个String[],就是导入到容器中的组件的全类名.我们需要自己实现这个接口,编写自己的选择导入逻辑即可.

    @Import({Book.class, User.class, MySelector.class})
    

    selectImports()方法有一个参数AnnotationMetadata,它表示当前标注@Import注解的类的所有注解信息.

    除了以上两种属性,Import注解还有一个属性:ImportBeanDefinitionRegistrar,它也是一个接口,有一个方法registerBeanDefinitions(),这个方法除了有AnnotationMetadata参数,还有一个BeanDefinitionRegister,代表组件注册的信息,可以通过它的方法registerBeanDefinition来自定义注册组件.

除了以上的注解来组合使用方便我们导入Bean组件,我们也可以使用spring的FactoryBean工厂来导入Bean.使用FactoryBean获取的bean是工厂调用getObject创建的对象,如果我们要获取工厂bean本身,需要在getObject方法中,在id前加&标识即可.

  • @PostConstruct

    在bean创建完,属性赋值结束以后调用标注方法,进行初始化

  • PreDestroy

    在容器销毁之前调用,进行清理工作

以上两个注解都是标注在JavaBean中的方法之上的

属性赋值

  • @Value

    该注解使用的时候可以有以下几种:

    1. 基本数值: @Value("张三")

    2. SpEl表达式: @Value("#{20-2}")

    3. 可以写${},取出配置文件中的值.需要配合下面的@PropertySource注解一起使用

      @Value("${xxx.xxx}")

  • @PropertySource

    加载配置文件,注解的value是个String[],可以指定多个

自动装配

  • @Autowired

    默认优先按照类型去容器中查找装配,如果找到多个再将属性的名称作为id去查找.

    该注解有个属性required,默认是true,表示是否必须,如果指定为false,则容器中没有该组件时,会默认为null.

    该注解可以标注在以下几个位置:

    1. 标注在方法上,会从IOC容器中获取对应的bean给方法中使用
    2. 标注在构造器上,构造器要用的参数也会从IOC容器中获取
    3. 标注在方法参数位置,同样是从容器中获取.
  • @Qualifier

    配合@Autowired使用,指定需要装配的组件的id

  • @Primary

    使用此注解让Spring在自动装配的时候,默认使用首选的bean.

    也就是说,如果不指定装配的组件的id时,默认使用加了@Primary注解的bean.

  • @Resource

    属于java的规范,也可以实现自动装配,但是该注解默认按照组件名称装配.

  • @Inject

    也可以实现自动装配,不过使用该注解需要导入javax.inject的包,功能和Autowired一样.

除了以上的注解来自动注入,如果我们要使用spring的底层组件,比如:applicationContext、BeanFactory等,只需要自定义一个组件,实现spring中的xxxAware接口,实现对应的方法即可.

Profile

指定组件在对应的环境下才能注册到容器中

  • @Profile

    对组件进行环境标识,只有当前环境**的时候才能注册到容器中.

    该注解标注的组件可以指定id.

    要**对应的 环境,有以下几种方式:

    1. 命令行参数: -Dspring.profiles.active=test

    2. //创建一个applicationContext
      AnnotationConfigApplicationContext application = new AnnotationConfigApplicationContext();
      //设置环境
      aoolicationContext.getEnvironment().setActiveProfiles("text", "dev");
      //注册配置类
      applicationContext.register(xxxx.class);
      //启动刷新容器
      applicationContext.refresh();
      
相关标签: spring注解