您现在的位置是:首页 >技术杂谈 >Java-Spring注解详解网站首页技术杂谈
Java-Spring注解详解
目录
三、@Controller、@RestController:控制器注解;
二十五、元注解:包括 @Retention @Target @Document @Inherited四种
一、@Configuration:
1.声明一个IOC容器,把所有标记了@Bean注解的类注入到IOC容器中去;与xml中配置的bean意思一样;程序启动就执行;
2.程序中 用@AutoWired 或 @Resource 注解 取得用@Bean注解的bean
二、@Value:
1.从配置文件读取值的用法,也就是从application.yaml文件中获取值,即使给变量赋了初值也会以配置文件的值为准。
2.非静态字段:直接在字段头 添加@Value(${配置的名称})
3.静态字段:通过 实例的构造函数new出来的实例对象访问 或者 通过new一个实例对象访问实例的方法得到实例的字段;
三、@Controller、@RestController:控制器注解;
四、@Service:服务层注解
五、@Repository:
1.是标记数据访问层的组件,用来注解接口的,被spring扫描并注入到ioc容器;
2.修饰哪个类表明这个类具有对数据库CRUD的功能,用在持久层的接口上
3.需要配合使用MapperScannerConfigurer或者@MapperScan注解。
4.与@Mapper 作用一致,二者取其一 或者 共用;
6.@Repository是spring的注解,@Mapper是mybatis的注解
7.这样可以直接在sercive类中,使用@Autowired注解,在创建一个私有的接口类对象,访问接口的实现类;
8.Mapper:注解是由Mybatis框架中定义的一个描述数据层接口的注解,配置 mapper.xml文件使用,查询数据库获得数据;在启动类上添加注解,如果 每个接口都要变成实现类,只需要在启动类添加@MapperScan("接口的路径地址")
六、@Component:
1.定义Spring管理Bean(也就是将标注@Component注解的类交由spring管理),然后用@Autowired取出spring容器(创建一个私有的实例对象);
七、@PostConstruct:
1.实现Bean初始化之前的自定义操作;该方法不能是 static;该方法可以是 final;
2.只有一个非静态方法能使用此注解
3.被注解的方法不得有任何参数,被注解的方法返回值必须为void,被注解方法不得抛出已检查异常
4.此方法只会被执行一次
5.执行流程:开始 -> Web容器加载Servlet -> Servlet构造函数 -> PostConstruct注解 -> Init() -> Service -> destory() -> PreDestory()注解 -> 结束
6.执行顺序在 过滤器(filter)后面
7.执行顺序:构造方法 > @Autowired > @PostConstruct
8.此注解时会影响到服务的启动时间。服务器在启动时会扫描WEB-INF/classes的所有文件和WEB-INF/lib下的所有jar包,并且可能需要与数据库交互来获取数据,然后放到缓存中。所以具体使用需要视业务场景而定
//创建一个 PostConstruct的初始化类 @Component public class PostConstructInit { public static String strLoad; @PostConstruct public void initLoad() { strLoad = "初始化环境----frist-----success--"; System.out.println("初始化环境----frist-----success--"); } @PreDestroy public void loadEnd(){ System.out.println("结束初始化环境----end-----success--"); } } //controller -执行 public class TestDemo(){ @Autowired private PostConstructInit postConstructInit; @RequestMapping("/test") public String test() { //调用@PostConstruct 的方法,加载程序初始化是的数据,如字典数据,或者缓存数据 String strLoad = postConstructInit.strLoad; return strLoad; } }
八、@PreDestroy:
1.实现Bean销毁之前的自定义操作;
2.被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。
3.被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前
九、@Primary:
1.自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常
//第一个类 public interface Worker { public String work(); } //第二个类 @Component public class Singer implements Worker { @Override public String work() { return "歌手的工作是唱歌"; } } //第三个类 @Component @Primary public class Doctor implements Worker { @Override public String work() { return "医生工作是治病"; } } // 启动类,调用接口 @SpringBootApplication @RestController public class SimpleWebTestApplication { @Autowired private Worker worker; @RequestMapping("/info") public String getInfo(){ return worker.work();//输出 医生工作是治病 } public static void main(String[] args) { SpringApplication.run(SimpleWebTestApplication.class, args); } }
十、@Lazy:
1.用于指定该Bean是否取消预初始化,用于注解类,延迟初始化
2.只不过是给spring的代理对象proxy再进行了一次proxy;
3.借用了方法invoke时通过proxy的intercept方法getTarget,然后进行方法调用,延迟了对象的注入。之后每次调用的时候都需要从Spring容器中获取到原生的proxy对象
4.主要解决 循环依赖 报错问题
@Lazy // 延迟加载 A @Service public class A { @Autowired private B b; @Async public void m1() { } } @Service public class B { @Autowired @Lazy // 延迟注入 A private A a; }
十一、@Autowired:
1.实现spring的依赖注入,自动装配,默认凭据类型注入;
2.Spring 框架提供的注解,它可以自动装配一个 Bean,可以根据类型进行匹配,也可以根据名称进行匹配。当有多个 Bean 可以匹配时,可以使用 @Qualifier 注解指定具体的 Bean
十二、@Resource:
1.用于依赖注入的注解, 默认根据名称装配;
2.Java EE 提供的注解,它也可以自动装配一个 Bean,但是它只能根据名称进行匹配。如果没有指定名称,则默认使用属性名作为 Bean 的名称进行匹配。
十三、@Async:
1.是一个异步方法;适用于异步场景,如:发邮件,导数据,同步商品等等;
2.主启动类没有添加@EnableAsync注解
3.被 @Async注解 修饰的方法必须不可以是static和private,必须为public
4.需要通过 @Autowired 或 @Resource 进行注入,不可手动new
5.被调用的@Async注解修饰的B方法,与调用者A不能存在同一个类,否则的话A方法就没有走spring代理类,没有经过Spring容器托管,从而造成了注解的失效;
@Async:异步方法 @RestController public class UserController { @Resource private UserService userService; @RequestMapping("/getAll") public String getUsers() throws ExecutionException, InterruptedException { System.out.println("业务开始"); Future<String> result = userService.getUsers(); System.out.println("业务结束"); return result.get(); } } @Service public class UserService { @Async public Future<String> getUsers(){ try { Thread.sleep(2000); System.out.println(Thread.currentThread().getName()+"查询到了所有的用户信息!"); } catch (InterruptedException e) { throw new RuntimeException(e); } return new AsyncResult<>("异步任务执行好了"); } } @SpringBootApplication @EnableAsync public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
十四、@Named:
1.定义Spring管理Bean(也就是将标注@Component注解的类交由spring管理),然后用@Autowired取出spring容器(创建一个私有的实例对象);
2.用法 和 @Component 一致;
十五、@Inject:
1.实现Java EE CDI方式的依赖注入。
2.跟 @Autowired 功能一样
十六、@Singleton:
1.只要在类上加上这个注解,就可以实现一个单例类,不需要自己手动编写单例实现类。
十七、@Valid:
1.用来校验接收参数的
2.使用 Hibernate validation 的时候使用,是 JSR-303 规范标准注解支持
3.可以用在方法、构造函数、方法参数和成员属性(field)上;
4.没有分组的功能,不能进行分组校验
5.可以进行嵌套校验,但是,需要在嵌套的字段上面加上注解;
6.valid -> 级联校验 也叫嵌套检测:
//valid -> 级联校验 也叫嵌套检测 @Data public class Hair { @NotBlank(message = "头发长度必须提交!") private Double length; @NotBlank(message = "头发颜色必须提交!") private String color; } @Data public class Person { @NotBlank(message = "用户姓名必须提交!") @Size(min=2, max=8) private String userName; // 添加@Valid注解实现嵌套检测 @Valid @NotEmpty(message = "用户要有头发!") private List<Hair> hairs; } @PostMapping("/person") public Result addPerson(@Valid @RequestBody Person person) { return Result.buildSuccess(person); }
十八、@Valided:
1.用来校验接收参数的
2.是spring校验机制;
3.可以用在类型、方法和方法参数上,不能用于成员属性(field)上
4.提供分组功能,可以在参数验证时,根据不同的分组采用不同的验证机制
5.不能进行嵌套对象校验;
6.分组校验顺序通过使用 @GroupSequence注解实现
7.Validated -> 分组校验:
//Validated-> 自定义分组校验 @RestController @RequestMapping("/person") public class PersonGroupController { // 不指定分组时校验 @GetMapping("/person") public Result getPerson(@Validated @RequestBody PersonGroup person) { return Result.buildSuccess(person); } // 指定AddGroup分组校验 @PostMapping("/person") public Result addPerson(@Validated(value = PersonGroup.AddGroup.class) @RequestBody PersonGroup person) { return Result.buildSuccess(person); } // 指定UpdateGroup分组校验 @PutMapping("/person") public Result updatePerson(@Validated(value = PersonGroup.updateGroup.class) @RequestBody PersonGroup person) { return Result.buildSuccess(person); } // 使用GroupSequence定义分组校验顺序:按照FirstGroup,SecondGroup分组顺序进行校验 @GroupSequence({PersonGroup.class, updateGroup.class}) public interface Group {} }
@Valid -> JSR-303 规范标准 | ||
---|---|---|
注解 | 验证的数据类型 | 备注 |
Null | 任意类型 | 参数值必须是 Null |
NotNull | 任意类型 | 参数值必须不是 Null |
NotBlank | 只能作用于字符串 | 字符串不能为 null,而且字符串长度必须大于0,至少包含一个非空字符串 |
NotEmpty | CharSequence Collection Map Array | 参数值不能为null,且不能为空 (字符串长度必须大于0,空字符串(“ ”)可以通过校验) |
Size(min,max ) | CharSequence Collection Map Array | 字符串:字符串长度必须在指定的范围内 Collection:集合大小必须在指定的范围内 Map:map的大小必须在指定的范围内 Array:数组长度必须在指定的范围内 |
Pattern(regexp) | 字符串类型 | 验证字符串是否符合正则表达式 |
Min(value) | 整型类型 | 参数值必须大于等于 最小值 |
Max(value) | 整型类型 | 参数值必须小于等于 最大值 |
DecimalMin(value) | 整型类型 | 参数值必须大于等于 最小值 |
DecimalMax(value) | 整型类型 | 参数值必须小于等于 最大值 |
Positive | 数字类型 | 参数值为正数 |
PositiveOrZero | 数字类型 | 参数值为正数或0 |
Negative | 数字类型 | 参数值为负数 |
NegativeOrZero | 数字类型 | 参数值为负数或0 |
Digits(integer,fraction) | 数字类型 | 参数值为数字,且最大长度不超过integer位,整数部分最高位不超过fraction位 |
AssertTrue | 布尔类型 | 参数值必须为 true |
AssertFalse | 布尔类型 | 参数值必须为 false |
Past | 时间类型(Date) | 参数值为时间,且必须小于 当前时间 |
PastOrPresent | 时间类型(Date) | 参数值为时间,且必须小于或等于 当前时间 |
Future | 时间类型(Date) | 参数值为时间,且必须大于 当前时间 |
FutureOrPresent | 时间类型(Date) | 参数值为时间,且必须大于或等于 当前日期 |
| 字符串类型 | 被注释的元素必须是电子邮箱地址 |
十九、@PathVariable:
1.用来指定请求URL中的变量
// 请求路径中的id必须是数字,否则寻找不到这个路径404 @GetMapping("/user/{id:\d+}") public Result getId(@PathVariable(name="id") String userId) { return Result.buildSuccess(userId); }
二十、自定义注解:
1.自定义校验注解类需要实现ConstraintValidator<A extends Annotation, T> 接口:
2.1.接口中第一个泛型参数表示的是自定义注解类
2.2.接口中第二个泛型参数表示的是校验的属性的值的类型
2.依赖
@Constraint
来 (自定义注解) 自定义注解以便进行对象属性的校验一、自定义Xss校验注解 @Retention(RetentionPolicy.RUNTIME) @Target(value = { ElementType.METHOD, ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER }) @Constraint(validatedBy = { XssValidator.class }) public @interface Xss { String message() default "不允许任何脚本运行"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } 二、校验器 public class XssValidator implements ConstraintValidator<Xss, String> { private final String HTML_PATTERN = "<(\S*?)[^>]*>.*?|<.*? />"; @Override public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) { return !containsHtml(value); } public boolean containsHtml(String value) { Pattern pattern = Pattern.compile(HTML_PATTERN); Matcher matcher = pattern.matcher(value); return matcher.matches(); } }
二十一、@RequestParam:
1.作用是提取和解析请求中的参数。
2.@RequestParam支持类型转换,类型转换目前支持所有的基本Java类型
3.使用方法:@RequestParam([value="number"], [required=false]) String number
二十二、@ControllerAdvice:
1.注解只能处理进入控制器方法抛出的异常
二十三、@CrossOrigin:
1.注解:是Cross-Origin ResourceSharing(跨域资源共享)
@CrossOrigin public class TestController extends BaseController { ....... }
二十四、@Scope:
1.配置bean的作用域。默认是单例模式,即@Scope("singleton")
二十四、@ResponseStatus:
1.用于修饰一个类或者一个方法,修饰一个类的时候,一般修饰的是一个异常类,当处理器的方法被调用时,返回 指定的code和reason会被返回给前端。value属性是http状态码,比如404,500等。reason是错误信息
@ResponseStatus(value=HttpStatus.FORBIDDEN, reason="出现了错误") public class UserException extends RuntimeException{ ...... } @ControllerAdvice @Component public class GlobalExceptionHandler { @Bean public MethodValidationPostProcessor methodValidationPostProcessor() { return new MethodValidationPostProcessor(); } @ExceptionHandler @ResponseBody @ResponseStatus(value=HttpStatus.BAD_REQUEST,reason="哈哈") public String handle(ValidationException exception) { System.out.println("bad request, " + exception.getMessage()); return "bad request, " + exception.getMessage(); } }
2.上面代码方法得到调用,不论是否抛异常,都会把value和reason添加到response里
二十五、元注解:包括 @Retention @Target @Document @Inherited四种
1.元注解是指注解的注解,比如我们看到的ControllerAdvice注解定义如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Component public @interface ControllerAdvice { XXX }
@Retention: 定义注解的保留策略:
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) //注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target:定义注解的作用目标:
@Target(ElementType.TYPE) //接口、类、枚举、注解
@Target(ElementType.FIELD) //字段、枚举的常量
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE)//局部变量
@Target(ElementType.ANNOTATION_TYPE)//注解
@Target(ElementType.PACKAGE) ///包
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解
二十六、@Scope:
1.配置bean的作用域。默认是单例模式,即@Scope("singleton")
二十七、Spring使用的注解大全和解释:
注解 | 解释 |
@Controller | 组合注解(组合了@Component注解),应用在MVC层(控制层),DispatcherServlet会自动扫描注解了此注解的类,然后将web请求映射到注解了@RequestMapping的方法上。 |
@Service | 组合注解(组合了@Component注解),应用在service层(业务逻辑层) |
@Reponsitory | 组合注解(组合了@Component注解),应用在dao层(数据访问层) |
@Component | 表示一个带注释的类是一个“组件”,成为Spring管理的Bean。当使用基于注解的配置和类路径扫描时,这些类被视为自动检测的候选对象。同时@Component还是一个元注解。 |
@Autowired | Spring提供的工具(由Spring的依赖注入工具(BeanPostProcessor、BeanFactoryPostProcessor)自动注入。) |
@Resource | JSR-250提供的注解 |
@Inject | JSR-330提供的注解 |
@Configuration | 声明当前类是一个配置类(相当于一个Spring配置的xml文件) |
@ComponentScan | 自动扫描指定包下所有使用@Service,@Component,@Controller,@Repository的类并注册 |
@Bean | 注解在方法上,声明当前方法的返回值为一个Bean。返回的Bean对应的类中可以定义init()方法和destroy()方法,然后在@Bean(initMethod=”init”,destroyMethod=”destroy”)定义,在构造之后执行init,在销毁之前执行destroy。 |
@Aspect | 声明一个切面(就是说这是一个额外功能) |
@After | 后置建言(advice),在原方法前执行。 |
@Before | 前置建言(advice),在原方法后执行。 |
@Around | 环绕建言(advice),在原方法执行前执行,在原方法执行后再执行(@Around可以实现其他两种advice) |
@PointCut | 声明切点,即定义拦截规则,确定有哪些方法会被切入 |
@Transactional | 声明事务(一般默认配置即可满足要求,当然也可以自定义) |
@Cacheable | 声明数据缓存 |
@EnableAspectJAutoProxy | 开启Spring对AspectJ的支持 |
@Value | 值得注入。经常与Sping EL表达式语言一起使用,注入普通字符,系统属性,表达式运算结果,其他Bean的属性,文件内容,网址请求内容,配置文件属性值等等 |
@PropertySource | 指定文件地址。提供了一种方便的、声明性的机制,用于向Spring的环境添加PropertySource。与@configuration类一起使用。 |
@PostConstruct | 标注在方法上,该方法在构造函数执行完成之后执行。 |
@PreDestroy | 标注在方法上,该方法在对象销毁之前执行。 |
@Profile | 表示当一个或多个指定的文件是活动的时,一个组件是有资格注册的。使用@Profile注解类或者方法,达到在不同情况下选择实例化不同的Bean。@Profile(“dev”)表示为dev时实例化。 |
@EnableAsync | 开启异步任务支持。注解在配置类上。 |
@Async | 注解在方法上标示这是一个异步方法,在类上标示这个类所有的方法都是异步方法。 |
@EnableScheduling | 注解在配置类上,开启对计划任务的支持。 |
@Scheduled | 注解在方法上,声明该方法是计划任务。支持多种类型的计划任务:cron,fixDelay,fixRate |
@Conditional | 根据满足某一特定条件创建特定的Bean |
@Enable* | 通过简单的@Enable来开启一项功能的支持。所有@Enable注解都有一个@Import注解,@Import是用来导入配置类的,这也就意味着这些自动开启的实现其实是导入了一些自动配置的Bean(1.直接导入配置类2.依据条件选择配置类3.动态注册配置类) |
@RunWith | 这个是Junit的注解,springboot集成了junit。一般在测试类里使用:@RunWith(SpringJUnit4ClassRunner.class) — SpringJUnit4ClassRunner在JUnit环境下提供Sprng TestContext Framework的功能 |
@ContextConfiguration | 用来加载配置ApplicationContext,其中classes属性用来加载配置类:@ContextConfiguration(classes = {TestConfig.class(自定义的一个配置类)}) |
@ActiveProfiles | 用来声明活动的profile–@ActiveProfiles(“prod”(这个prod定义在配置类中)) |
@EnableWebMvc | 用在配置类上,开启SpringMvc的Mvc的一些默认配置:如ViewResolver,MessageConverter等。同时在自己定制SpringMvc的相关配置时需要做到两点:1.配置类继承WebMvcConfigurerAdapter类2.就是必须使用这个@EnableWebMvc注解。 |
@RequestMapping | 用来映射web请求(访问路径和参数),处理类和方法的。可以注解在类和方法上,注解在方法上的@RequestMapping路径会继承注解在类上的路径。同时支持Serlvet的request和response作为参数,也支持对request和response的媒体类型进行配置。其中有value(路径),produces(定义返回的媒体类型和字符集),method(指定请求方式)等属性。 |
@ResponseBody | 将返回值放在response体内。返回的是数据而不是页面 |
@RequestBody | 允许request的参数在request体中,而不是在直接链接在地址的后面。此注解放置在参数前。 |
@PathVariable | 放置在参数前,用来接受路径参数。 |
@RestController | 组合注解,组合了@Controller和@ResponseBody,当我们只开发一个和页面交互数据的控制层的时候可以使用此注解。 |
@ControllerAdvice | 用在类上,声明一个控制器建言,它也组合了@Component注解,会自动注册为Spring的Bean。 |
@ExceptionHandler | 用在方法上定义全局处理,通过他的value属性可以过滤拦截的条件:@ExceptionHandler(value=Exception.class)–表示拦截所有的Exception。 |
@ModelAttribute | 将键值对添加到全局,所有注解了@RequestMapping的方法可获得次键值对(就是在请求到达之前,往model里addAttribute一对name-value而已)。 |
@InitBinder | 通过@InitBinder注解定制WebDataBinder(用在方法上,方法有一个WebDataBinder作为参数,用WebDataBinder在方法内定制数据绑定,例如可以忽略request传过来的参数Id等)。 |
@WebAppConfiguration | 一般用在测试上,注解在类上,用来声明加载的ApplicationContext是一个WebApplicationContext。他的属性指定的是Web资源的位置,默认为src/main/webapp,我们可以修改为:@WebAppConfiguration(“src/main/resources”)。 |
@EnableAutoConfiguration | 此注释自动载入应用程序所需的所有Bean——这依赖于Spring Boot在类路径中的查找。该注解组合了@Import注解,@Import注解导入了EnableAutoCofigurationImportSelector类,它使用SpringFactoriesLoader.loaderFactoryNames方法来扫描具有META-INF/spring.factories文件的jar包。而spring.factories里声明了有哪些自动配置。 |
@SpingBootApplication | SpringBoot的核心注解,主要目的是开启自动配置。它也是一个组合注解,主要组合了@Configurer,@EnableAutoConfiguration(核心)和@ComponentScan。可以通过@SpringBootApplication(exclude={想要关闭的自动配置的类名.class})来关闭特定的自动配置。 |
@ImportResource | 虽然Spring提倡零配置,但是还是提供了对xml文件的支持,这个注解就是用来加载xml配置的。例:@ImportResource({“classpath |
@ConfigurationProperties | 将properties属性与一个Bean及其属性相关联,从而实现类型安全的配置。例:@ConfigurationProperties(prefix=”authot”,locations={“classpath |
@ConditionalOnBean | 条件注解。当容器里有指定Bean的条件下。 |
@ConditionalOnClass | 条件注解。当类路径下有指定的类的条件下。 |
@ConditionalOnExpression | 条件注解。基于SpEL表达式作为判断条件。 |
@ConditionalOnJava | 条件注解。基于JVM版本作为判断条件。 |
@ConditionalOnJndi | 条件注解。在JNDI存在的条件下查找指定的位置。 |
@ConditionalOnMissingBean | 条件注解。当容器里没有指定Bean的情况下。 |
@ConditionalOnMissingClass | 条件注解。当类路径下没有指定的类的情况下。 |
@ConditionalOnNotWebApplication | 条件注解。当前项目不是web项目的条件下。 |
@ConditionalOnResource | 条件注解。类路径是否有指定的值。 |
@ConditionalOnSingleCandidate | 条件注解。当指定Bean在容器中只有一个,后者虽然有多个但是指定首选的Bean。 |
@ConditionalOnWebApplication | 条件注解。当前项目是web项目的情况下。 |
@EnableConfigurationProperties | 注解在类上,声明开启属性注入,使用@Autowired注入。例:@EnableConfigurationProperties(HttpEncodingProperties.class)。 |
@AutoConfigureAfter | 在指定的自动配置类之后再配置。例:@AutoConfigureAfter(WebMvcAutoConfiguration.class) |