Spring系列常用注解说明
一、SpringBoot/Spring框架注解
1. @SpringBootApplication
- 包含的核心注解:@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {...}
2. @SpringBootConfiguration
- 核心注解@Configuration,让当前类作为一个配置类交由 Spring 的 IOC 容器进行管理。
3. @EnableAutoConfiguration
- 实现自动装配。由 @AutoConfigurationPackage 和 @Import 注解组成的复合注解。
4. @ComponentScan
- 用于定义 Spring 的扫描路径。如果不配置扫描路径,Spring 会默认扫描当前类所在的包及其子包中的所有标注了 @Component,@Service,@Controller 等注解的类。
5. @Repository
- 用于标注数据访问组件,即DAO组件。
6. @Service
- 用于标注业务层组件。
7. @RestController
- 用于标注控制层组件(如struts中的action),包含@Controller和@ResponseBody。
8. @Controller
- 用于标注是控制层组件,需要返回页面时请用@Controller而不是@RestController。
9. @Component
- 通用注解,用于标记一个类为组件,让Spring能够在应用程序启动时自动扫描并加载这些组件,但只会自动扫描指定包及其子包下的组件。可以在启动类上添加@ComponentScan注解,指定要扫描的包路径。
10. @ResponseBody
- 将Controller的方法返回的对象,通过适当的转换器转换为指定的格式之后,写入到response对象的body区。使用此注解之后不会再走视图处理器。
- 一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,
加上@responsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response的body中。
11. @RequestBody:
- 主要用来接收前端传递给后端的json字符串中的数据。
- 与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。
12. @ComponentScan
- 用于类或接口上主要是指定扫描路径,spring会把指定路径下带有指定注解的类(@Controller、@Service、@Component、@Repository等)自动装配到bean容器里。
- 默认会扫描该类所在的包及其子包下的组件。
- 没有显示配置组件id时,就会把类名第一位转化为小写作为该组件的id。如果不同包中有相同名字的类,在扫描时就会报错。
1. 扫描指定类文件
@ComponentScan(basePackageClasses = Person.class)
2. 扫描指定包,使用默认扫描规则,即被@Component, @Repository, @Service, @Controller或者已经声明过@Component自定义注解标记的组件;
@ComponentScan(value = "com.example")
3. 扫描指定包,加载被@Component注解标记的组件和默认规则的扫描(因为useDefaultFilters默认为true)
@ComponentScan(value = "com.example", includeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
4. 扫描指定包,只加载Person类型的组件
@ComponentScan(value = "com.example", includeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, value = Person.class) }, useDefaultFilters = false)
5. 扫描指定包,过滤掉被@Component标记的组件
@ComponentScan(value = "com.example", excludeFilters = { @Filter(type = FilterType.ANNOTATION, value = Component.class) })
6. 扫描指定包,自定义过滤规则
@ComponentScan(value = "com.example", includeFilters = { @Filter(type = FilterType.CUSTOM, value = MtyTypeFilter.class) }, useDefaultFilters = true)
13. @Configuration
- 指示一个类声明一个或多个@Bean方法,并且可以由Spring容器处理,以便在运行时为这些bean生成BeanDefinition和服务请求。
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
//...
}
}
14. @Bean
- 用于将对象存入spring的ioc容器中,同@controller、@Service、@Component、@Configuration、@Repository等几个注解是一样的,都是负责将对象存入容器当中。只不过方式不同,他们是用在类上面的,然后将当前类通过无参构造函数创建对象然后放入容器,而@Bean是用在方法上,将当前方法的返回值对象放到容器当中。
15. @AutoWired:
- 可以对成员变量、方法和构造函数进行标注,来完成自动装配。
- 默认根据类型进行自动装配,如果需要按名称进行装配,则需要配合@Qualifier使用。
- 它的注入方式通过Java的反射机制实现,所以private的成员也可以被注入具体的对象。
- 当遇到两个及以上相同类型的bean时,则会报错,找不到准确的bean。改为根据属性名自动装配,或者加上(required=false)设置为不自动装配,就算找不到bean也不报错。
16. @Qualifier
- 当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用;
17. @Resource(name=”name”,type=”type”)
- 默认按byName进行注入,如果无法通过名称匹配到对应的 Bean 的话,注入方式会变为byType。
- @Resource是Java自己的注解,Spring将@Resource注解的name属性解析为bean的名称,type属性解析为bean的类型。
18. @RequestMapping
- RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。
- 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法。
- 从源码中可以看到value属性是一个字符串类型数组,因此说明可以将多个请求映射到一个方法上,只需要给 value 来指定一个包含多个路径的数组(@RequestMapping(value = {“/test1”,“/test2”}))。
//@RequestMapping注解类源码
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String name() default "";
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
19. @GetMapping、@PostMapping、@PutMapping等
相当于@RequestMapping(value=”/”,method=RequestMethod.Get\Post\Put\Delete等) 。是个组合注解;
20. @RequestParam:
- 用在方法的参数前面。相当于 request.getParameter()。将指定的请求参数赋值给方法中的形参。
1.value:请求参数名(必须)。
2.required:是否必需,默认为 true,即请求中必须包含该参数,如果没有包含,将会抛出异常(可选)。
3.defaultValue:默认值,如果设置了该值,required将自动设为false,无论你是否配置了required,值是什么,都是false(可选)。
21. @PathVariable
- 映射url绑定的占位符。将url中占位符参数绑定到控制器处理方法的参数中。
@RequestMapping("/user/{id}")
public String testPathVariable(@PathVariable("id") String id){
return "success";
}
- 方法参数名称和需要绑定的url中变量名称一致时,可以简写。
@RequestMapping("/user/{id}")
public String testPathVariable(@PathVariable String id){
return "success";
}
22. @CrossOrigin
- 将为请求处理类或请求处理方法提供跨域调用支持。
- 如果在类上加此注解,那么类中的所有方法都将获得支持跨域的能力。
23. @Primary
- 当系统中需要配置多个具有相同类型的bean时,@Primary可以定义这些Bean的优先级。
public interface UserService {
public void sendMsg();
}
@Component
public class Test1 implements UserService {
@Override
public void sendMsg(){
System.out.println("111");
};
}
@Primary
@Component
public class Test2 implements UserService {
@Override
public void sendMsg(){
System.out.println("222");
};
}
@RestController
public class TestController(){
@Awtowired
private UserService userService;
@GetMapping("/index")
public String test(){
userService.sendMsg();
return "ok";
}
}
//输出结果为222