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:过滤规则,根据不同的过滤类型配置不同的规则
- type:过滤类型
-
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接口的类(可传入多个),类中定义自己需要的条件。
使用:
-
自定义类实现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; } } -
使用注解
@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数据

浙公网安备 33010602011771号