spring注解总结

@Configuration

作用在类上,表名该类是一个配置类,相当于一个xml配置文件,包含了@Component,被@Configuration注解修饰的类本身也被注册进了spring容器,默认proxyBeanMethods的值为true,代理bean的方法,调用该类下的bean方法是单实例调用。

@Configuration(proxyBeanMethods = false)

@Bean

作用在方法上,声明当前方法的返回值是一个bean,组件类型是方法返回值,组件id默认为方法名,组件id也可以在bean中定义。

常用属性:

  • value / name:指定组件的名称,如果不指定,默认是方法名
  • initMethod:指定初始化方法,在构造之后执行
  • destroyMethod:指定销毁方法,在销毁之前执行
@Bean(value = "user",initMethod="init",destroyMethod="destroy")

@ComponentScan

作用在类上,自动扫描指定包下所有使用@Service,@Component,@Controller,@Repository的类并注册,效果等同于context:component-scan

常用属性:

  • value / basePackages:指定要扫描的包名

    //扫描spring.io.controller下的所有包含@Service,@Component,@Controller,@Repository的类并注册
    @ComponentScan(value = "spring.io.controller")
    
  • excludeFilters:按照规则排除某些包的扫描。

    //在 spring 扫描的时候,就会跳过 spring.io 包下,所有被 @Controller 注解标注的类。
    @ComponentScan(value = "spring.io",
            //excludeFilters 的参数是一个 Filter[] 数组, 指定 FilterType 的类型为 ANNOTATION,即通过注解来过滤
            excludeFilters = {@Filter(type = FilterType.ANNOTATION,value = {Controller.class})}
            )
    
  • includeFilters:按照规则只包含某些包的扫描。需要配置 useDefaultFilters 属性为false。

    //只包含 @Controller 注解的类才会被注册到容器中
    @ComponentScan(value = "io.mieux", 
             includeFilters = {@Filter(type = FilterType.ANNOTATION, classes = {Controller.class})}
            )
    
  • @Filter:用于指定过滤的规则

    • type:过滤类型
      • FilterType.ANNOTATION:按照注解的方式
      • FilterType.ASSIGNABLE_TYPE:按照给定的类型
      • FilterType.ASPECTJ:使用ASPECTJ表达式
      • FilterType.REGEX:使用正则表达式
      • FilterType.CUSTOM:自定义类型
    • value / classes:过滤值
    • pattern:过滤规则,根据不同的过滤类型配置不同的规则
  • useDefaultFilters:是否使用默认过滤规则, 默认是 true

自定义过滤规则FilterType.CUSTOM的使用

public class MyTypeFilter implements TypeFilter {

    /**
     * 匹配方法,确定此过滤器是否与给定元数据描述的类匹配
     * @param metadataReader 读取到的当前正在扫描的类的信息
     * @param metadataReaderFactory 可以获取到其他任何类的信息
     * @return true:匹配, false:不匹配
     * @throws IOException
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
        //获取当前类的注解信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //获取当前正在扫描的类的信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //获取当前类资源(类的路劲)
        Resource resource = metadataReader.getResource();

        //自定义匹配规则
        String className = classMetadata.getClassName();
        if(className.contains("Controller")){
            return true;
        }
        return false;
    }
}
@ComponentScan(value = "io.mieux",
      includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM, value ={MyTypeFilter.class})},
      useDefaultFilters = false)

添加多种扫描规则:

jdk1.8以上支持添加多个 @ComponentScan 来添加多个扫描规则,但是在配置类中要加上 @Configuration 注解,否则无效。

@ComponentScan(value = "io.mieux.controller")
@ComponentScan(value = "io.mieux.service")
@Configuration
public class BeanConfig {...}

也可以使用 @ComponentScans 来添加多个 @ComponentScan,从而实现添加多个扫描规则。同样,也需要加上 @Configuration 注解,否则无效。

@ComponentScans(value = 
        {@ComponentScan(value = "io.mieux.controller"),
        @ComponentScan(value = "io.mieux.service")})
@Configuration
public class BeanConfig {...}

@Scope

作用域,作用在配置类中或者类中的bean方法上,指它创建的Bean对象对于其他Bean对象的请求的可视范围

value的值:

  • singleton:单实例,ioc容器启动的时候就会调用方法,创建bean对象,以后每次获取都是直接从ioc容器中取(map.get()),默认方式。
  • prototype:多实例,ioc容器启动的时候不会去调用,当从ioc容器中获取bean对象的时候才会创建。
  • request:同一次请求创建一个实例。
  • session:同一个session范围创建一个实例。
  • global session:全局session范围创建一个实例,一般用于集群。
@Bean("cat")
@Scope(value = "singleton")
public Cat cat(){
    return new Cat("tomcat");
}

@Lazy

懒加载,一般用于单例模式,容器启动的时候不会创建bean,第一次调用的时候才会创建,value默认值为true,作用在配置类中的bean方法上。

@Bean("cat")//也可以在bean中配置组件id
@Scope(value = "singleton")
@Lazy
public Cat cat(){
    return new Cat("tomcat");
}

@Conditional

作用在类或方法上

按照一定条件进行判断,满足条件才注册bean,可以放在方法或类上,此注解在Spring Boot底层大量使用。

value:传入一个继承了Condition接口的类(可传入多个),类中定义自己需要的条件。

使用:

  1. 自定义类实现Condition接口,定义条件

    public class WindowsCondition implements Condition {
     
        /**
         * @param conditionContext:判断条件能使用的上下文环境
         * @param annotatedTypeMetadata:注解所在位置的注释信息
         * */
        @Override
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            //获取ioc使用的beanFactory
            ConfigurableListableBeanFactory beanFactory = conditionContext.getBeanFactory();
            //获取类加载器
            ClassLoader classLoader = conditionContext.getClassLoader();
            //获取当前环境信息
            Environment environment = conditionContext.getEnvironment();
            //获取bean定义的注册类
            BeanDefinitionRegistry registry = conditionContext.getRegistry();
     
            //获得当前系统名
            String property = environment.getProperty("os.name");
            //包含Windows则说明是windows系统,返回true
            if (property.contains("Windows")){
                return true;
            }
            return false;
        }
    }
    
  2. 使用注解

    @Conditional({WindowsCondition.class})
    @Bean(name = "bill")
    public Person person1(){
        return new Person("Bill Gates",62);
    }
    

其他条件注解:

注解 描述
@ConditionalOnBean 条件注解。当容器里有指定Bean的条件下。
@ConditionalOnClass 条件注解。当类路径下有指定的类的条件下。
@ConditionalOnExpression 条件注解。基于SpEL表达式作为判断条件。
@ConditionalOnJava 条件注解。基于JVM版本作为判断条件。
@ConditionalOnJndi 条件注解。在JNDI存在的条件下查找指定的位置。
@ConditionalOnMissingBean 条件注解。当容器里没有指定Bean的情况下。
@ConditionalOnMissingClass 条件注解。当类路径下没有指定的类的情况下。
@ConditionalOnNotWebApplication 条件注解。当前项目不是web项目的条件下。
@ConditionalOnResource 条件注解。类路径是否有指定的值。
@ConditionalOnSingleCandidate 条件注解。当指定Bean在容器中只有一个,后者虽然有多个但是指定首选的Bean。
@ConditionalOnWebApplication 条件注解。当前项目是web项目的情况下。

例如@ConditionalOnBean的使用

@ConditionalOnBean(name = "cat")//当容器中有cat时才把user注册进容器
@Bean
public User user(){
    return new User("lisi",13);
}

@Import

给ioc容器中导入指定的组件,作用在类上面,属性value是class数组,可以传入多个值。

@Import({User.class, DBHelper.class})

@ImportResource

加载一个xml资源,和spring xml配置里import语义相同,作用在类上

@ImportResource("classpath:bean.xml")

@Component

作用在类上,把普通pojo实例化到spring容器中,泛指各种组件

@Controller

组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类,然后将web请求映射到注解了@RequestMapping的方法上。

@Service

组合注解(组合了@Component注解),应用在service层(业务逻辑层)

@Reponsitory

组合注解(组合了@Component注解),应用在dao层(数据访问层)

@Autowired

修饰字段,方法,构造函数,入参,实现自动注入,这个注解是属于spring,默认按类型装配

@Resource

这个注解属于J2EE,默认按名称装配

@PathVariable

接收请求路径中占位符的值,通过 @PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)

注:@PathVariable的值要和占位符的参数值保持一致

@RequestMapping("show/{id}/{name}")
public ModelAndView test5(@PathVariable("id") Long ids ,@PathVariable("name") String names){
    ModelAndView mv = new ModelAndView();
    mv.addObject("msg","占位符映射:id:"+ids+";name:"+names);
    mv.setViewName("hello2");
    return mv;
}

当请求url是http://localhost:8080/hello/show/1/jame时,ids的值为1,names的值为jame

@RequestMapping

作用在类或方法上,用来处理请求地址映射(也即将请求映射到对应的控制器方法中),@RequestMapping的value值前后是否有“/”对请求的路径没有影响,即value="book" 、"/book"、"/book/"其效果是一样的。

属性:

  • value:指定请求的实际url

    • 具体值:@RequestMapping("/hello")
    • 含变量:@RequestMapping(value="/get/{bookId}"),使用@PathVariable注解提取占位符中的变量
    • ant风格
      • @RequestMapping(value="/get/id?"):可匹配“/get/id1”或“/get/ida”,但不匹配“/get/id”或“/get/idaa”
      • @RequestMapping(value="/get/id*"):可匹配“/get/idabc”或“/get/id”,但不匹配“/get/idabc/abc”;
      • @RequestMapping(value="/get/id/*"):可匹配“/get/id/abc”,但不匹配“/get/idabc”;
      • @RequestMapping(value="/get/id/**/{id}"):可匹配“/get/id/abc/abc/123”或“/get/id/123”,也就是Ant风格和URI模板变量风格可混用。
    • 含正则表达式
      • @RequestMapping(value="/get/{idPre:\d+}-{idNum:\d+}"):可以匹配“/get/123-1”,但不能匹配“/get/abc-1”
    • 或关系
      • @RequestMapping(value={"/get","/fetch"} )即 /get或/fetch都会映射到该方法上。
  • method:指定请求的类型,GET,POST,PUT,DELETE

    @RequestMapping(value="/get/{bookid}",method={RequestMethod.GET,RequestMethod.POST})
    
  • params:指定请求url中必须包含某些参数值时,才让该方法处理

    • @RequestMapping(params="action=del"),请求参数包含“action=del”,如:http://localhost:8080/book?action=del

      @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, params="myParam=myValue")
      
  • headers:指定request中必须包含某些特定header值,才能让该方法处理请求。

    • @RequestMapping(value="/header/id", headers = "Accept=application/json"):表示请求的URL必须为“/header/id 且请求头中必须有“Accept =application/json”参数即可匹配。
  • consumes:指定处理请求的提交内容类型(Content-Type),例如application/json,text/html。

    //方法仅处理request Content-Type为“application/json”类型的请求。
    @RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
    
  • produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。

    //方法仅处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json
    @RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
    

@RequestParam

绑定单个请求参数值,用于将请求参数数据映射到功能处理方法的参数上

public String requestparam1(@RequestParam String username)//请求中包含username参数,则自动传入

参数:

  • vlaue :参数名
  • require:是否必须,默认为true,表示请求中一定要有相应的参数,否则将抛出异常
  • defaultValue:默认值,表示如果请求中没有同名参数时的默认值,设置该参数时,自动将required设为false。
public String requestparam4(@RequestParam(value="username",required=false) String username)

表示请求中可以没有名字为username的参数,如果没有默认为null

@ResponseBody

用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。当返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用。

@Responsebody表示该方法的返回结果直接写入HTTP response body中。一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@Responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。比如异步获取json数据,加上@Responsebody后,会直接返回json数据。

@RequestBody

将HTTP请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象。

作用:
i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
ii) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。
使用时机
A) GET、POST方式提时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 可选(即非必须,因为这种情况的数据@RequestParam, @ModelAttribute也可以处理,当然@RequestBody也能处理);
multipart/form-data, 不能处理(即使用@RequestBody不能处理这种格式的数据);
其他格式, 必须(其他格式包括application/json, application/xml等。这些格式的数据,必须使用@RequestBody来处理);

B) PUT方式提交时, 根据request header Content-Type的值来判断:
application/x-www-form-urlencoded, 必须;
multipart/form-data, 不能处理;
其他格式, 必须;
说明:request的body部分的数据编码格式由header部分的Content-Type指定;

public String test(@RequestBody User user)//以user对象接收前端传过来的json数据
posted @ 2021-06-07 20:37  刘晶清  阅读(109)  评论(0)    收藏  举报