关于后端:一篇带你了解Java开发中常用的注解与作用

42次阅读

共计 7230 个字符,预计需要花费 19 分钟才能阅读完成。

JAVA 开发罕用框架注解与作用

一起交换:CN.ITLTT.COM

Spring 全家桶

申明 Bean

  • @Component组件,没有明确的角色。
  • @Service在业务逻辑层应用 ->Service 层。
  • [email protected]在数据拜访层应用 ->Dao 层。
  • @Controller在展示层应用,控制器的申明。

注入 Bean

  • @Autowired由 Spring 提供,依据类型进行主动拆卸,如果组合 @Qualifier 应用将按名称进行拆卸。
  • @InjectJSR-330 提供应用时须要导入 javax.inject.Inject 实现注入同样是依据类型进行主动拆卸,如果须要按名称进行拆卸,则须要配合@Named
  • @ResourceJSR-250 提供,应用须要导入 javax.annotation,依据名称进行主动拆卸的,个别会指定一个name 属性。

申明性能

  • @Transactional申明事务
  • @Cacheable申明缓存

配置相干

  • @Configuration申明以后类为配置类。
  • @Bean注解在办法上,申明以后办法的返回值为一个bean
  • @ComponentScan用于对 Component 进行扫描 -> 自定义门路。
  • @WishlyConfiguration@Configuration@ComponentScan的组合注解,能够代替这两个注解。

AOP 相干

  • @Aspect申明一个切面。
  • @After在办法执行之后执行。
  • @Before在办法执行之前执行。
  • @Around在办法执行之前与之后都执行。
  • @PointCut申明切点。

@Bean 的属性反对

@Scope设置 Spring 新建 Bean模式,可抉择包含如下:

  • Singleton单例, 一个 Spring 容器中只有一个 bean 实例,默认模式。
  • Protetype每次调用新建一个bean
  • Request web我的项目中,给每个 http request 新建一个bean
  • Session web我的项目中,给每个 http session 新建一个bean
  • GlobalSession(给每一个 global http session 新建一个 Bean 实例。

Class 生命周期相干

  • @PostConstructJSR-250 提供,在类的构造函数执行完之后执行,等价于 xml 配置文件中 beaninitMethod
  • @PreDestoryJSR-250 提供,在 Bean 销毁之前执行。

配置项注入

@Value为属性注入值,反对如下形式的注入:

  • 一般字符@Value(“JanYork”)
  • 操作系统属性@Value("#{systemProperties[‘os.name’]}")
  • 表达式后果@Value("#{ T(java.lang.Math).random() * 100}")
  • 其它 bean 属性@Value("#{domeClass.name}")
  • 文件资源@Value(“classpath:cn/janyork/demo.txt”)
  • 网站资源@Value(“https://ideaopen.cn”)
  • 配置文件属性@Value("${book.name}")

注入配置文件@PropertySource(“classpath:cn/janyork/dev.propertie”)

也能够读取 yml 文件配置。

开发环境配置

  • @Profile通过设定 EnvironmentActiveProfiles来设定以后 context 须要应用的配置环境。
  • @Conditional依据代码中设置的条件装载不同的bean,包含一系列的注解。

    • @ConditionalOnBean存在bean
    • @ConditionalOnMissingBean不存在bean
    • @ConditionalOnClass存在某个类。
    • @ConditionalOnMissingClass不存在某个类。
    • @ConditionalOnProperty(prefix =“jan”, name =“york”, havingValue =“token”)当存在配置文件中以 jan 为前缀的属性,属性名称为 york,而后它的值为token 时才会实例化一个类。
    • @ConditionalOnProperty(prefix =“jan”, name =“york”, havingValue =“counter”, matchIfMissing = true)如果所有的都不满足的话就抉择 counter 为默认实现。
    • @ConditionalOnJava如果是 Java 利用。
    • @ConditionalOnWebApplication如果是 Web 利用。

异步注解

@Async在理论执行的 bean 办法应用该注解来申明其是一个异步工作。

定时工作

@Scheduled来申明这是一个工作,包含 cronfixDelayfixRate 等类型。

开启某些性能

  • @EnableAspectJAutoProxy开启对 AspectJ 主动代理的反对。
  • @EnableAsync开启异步办法的反对。
  • @EnableScheduling开启打算工作的反对。
  • @EnableWebMvc开启 Web MVC 的配置反对。
  • @EnableConfigurationProperties开启对 @ConfigurationProperties 注解配置 Bean 的反对。
  • @EnableJpaRepositories开启对 SpringData JPA Repository 的反对。
  • @EnableTransactionManagement开启注解式事务的反对。
  • @EnableCaching开启注解式的缓存反对。

测试相干

  • @RunWith Spring中通常用于对 JUnit 的反对。
  • @ContextConfiguration用来加载配置ApplicationContext
  • @Test用于单元测试。

MVC 相干

  • @RequestMapping用于映射 Web 申请,包含拜访门路和参数。
  • ResponseBody反对将返回值放在 response 内,而不是一个页面。
  • @PathVariable用于接管门路参数。
  • @RestController该注解为一个组合注解,相当于 @Controller@ResponseBody的组合,注解在类上,意味着,该 Controller 的所有办法都默认加上了@ResponseBody
  • @ControllerAdvice通过该注解,咱们能够将对于控制器的全局配置搁置在同一个地位,注解了 @Controller 的类的办法可应用 @ExceptionHandler@InitBinder@ModelAttribute 注解到办法上,
    这对所有注解了 @RequestMapping 的控制器内的办法无效。
  • @ExceptionHandler用于全局解决控制器里的异样。
  • @InitBinder用来设置 WebDataBinderWebDataBinder 用来主动绑定前台申请参数到 Model 中。
  • @ModelAttribute原本的作用是绑定键值对到 Model 里,在 @ControllerAdvice 中是让全局的 @RequestMapping 都能取得在此处设置的键值对。

Boot 相干

  • @EnableAutoConfiguration主动载入应用程序所需的所有 Bean。该注解组合了@Import 注解,@Import注解导入了 EnableAutoCofigurationImportSelector 类,它应用 SpringFactoriesLoader.loaderFactoryNames 办法来扫描具备 META-INF/spring.factories 文件的 jar 包。而 spring.factories 里申明了有哪些主动配置
    ​+ @SpingBootApplication SpringBoot 的外围注解,次要目标是开启主动配置。它也是一个组合注解,次要组合了 @Configurer@EnableAutoConfiguration(外围)和@ComponentScan。能够通过@SpringBootApplication(exclude={想要敞开的主动配置的类名.class}) 来敞开特定的主动配置。
  • @ImportResource加载 xml 配置的。
  • @AutoConfigureAfter在指定的主动配置类之后再配置。

MyBatis

SQL 语句映射

@Insert实现新增性能。

@Select实现查问性能。

@SelectKey插入后,获取 id 的值。

@Insert实现插入性能。

@Update实现更新性能。

@Delete实现删除性能。

后果集映射

@Result@Results@ResultMap是后果集映射的三大注解。

@Results各个属性的含意:

id为以后后果集申明惟一标识,value值为后果集映射关系,@Result代表一个字段的映射关系,column指定数据库字段的名称,property指定实体类属性的名称,jdbcType数据库字段类型,@Result里的 id 值为 true 表明主键,默认false

应用 @ResultMap 来援用映射后果集,其中 value 可省略。

关系映射

@one用于一对一关系映射。

@many用于一对多关系映射。

MyBatisPlus

请看官网文档。

Lombok

  • @Getter@Setter -> 主动产生 getter/setter
  • @ToString-> 主动重写 toString() 办法,会印出所有变量。
  • @EqualsAndHashCode-> 主动生成 equals(Object other)hashcode() 办法,包含所有非动态变量和非 transient 的变量。

  • @NoArgsConstructor、@AllArgsConstructor,、@RequiredArgsConstructor

这三个很像,都是在主动生成该类的结构器,差异只在生成的结构器的参数不一样而已。

  • @NoArgsConstructor生成一个没有参数的结构器。
  • @AllArgsConstructor生成一个蕴含所有参数的结构器。
  • @RequiredArgsConstructor生成一个蕴含 “ 特定参数 ” 的结构器,特定参数指的是那些有加上 final 修饰词的变量们。

留神:

这里留神一个 Java 的小坑,当咱们没有指定结构器时,Java编译器会帮咱们主动生成一个没有任何参数的结构器给该类,然而如果咱们本人写了结构器之后,Java就不会主动帮咱们补上那个无参数的结构器了。

然而很多中央(像是 Spring Data JPA),会须要每个类都肯定要有一个无参数的结构器,所以你在加上 @AllArgsConstructor 时,肯定要补上 @NoArgsConstrcutor,不然会有各种坑等着你。


@Data:整合包,只有加了 @Data 这个注解,等于同时加了以下注解。

  • @Getter/@Setter
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

@Value:整合包,然而他会把所有的变量都设成 final 的,其余的就跟 @Data 一样,等于同时加了以下注解。

  • @Getter (没有setter)
  • @ToString
  • @EqualsAndHashCode
  • @RequiredArgsConstructor

@Builder:主动生成流式 set 值写法,从此之后再也不必写一堆 setter了。

留神,尽管只有加上 @Builder 注解,咱们就可能用流式写法疾速设定对象的值,然而 setter 还是必须要写不能省略的,因为 Spring 或是其余框架有很多中央都会用到对象的 getter/setter 对他们取值 / 赋值

所以通常是 @Data@Builder 会一起用在同个类上,既不便咱们流式写代码,也不便框架做事。

@Slf4j:主动生成该类的 log 动态常量,要打日志就能够间接打,不必再手动 new log 动态常量了。

除了 @Slf4j 之外,lombok 也提供其余日志框架的变种注解能够用,像是 @Log@Log4j … 等,他们都是帮咱们创立一个动态常量 log,只是应用的库不一样而已。

@Log // 对应的 log 语句如下
private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger(LogExample.class.getName());

@Log4j // 对应的 log 语句如下
private static final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger(LogExample.class);

SpringBoot默认反对的就是 slf4j + logback 的日志框架,所以也不必再多做啥设定,间接就能够用在 SpringBoot project上,log 系列注解最罕用的就是 @Slf4j

Shiro

@RequiresAuthentication验证用户是否登录,等同于办法 subject.isAuthenticated() 后果为 true 时。

@RequiresUser验证用户是否被记忆,user 有两种含意:

  • 一种是胜利登录的(subject.isAuthenticated()后果为true)。
  • 另外一种是被记忆的(subject.isRemembered()后果为true)。

@RequiresGuest验证是否是一个 guest 的申请,与 @RequiresUser 齐全相同。换言之,RequiresUser == !RequiresGuest。此时 subject.getPrincipal() 后果为null

@RequiresRoles例如:

@RequiresRoles("JanYork");
void someMethod();

如果 subject 中有 JanYork 角色才能够拜访办法someMethod。如果没有这个权限则会抛出异样AuthorizationException

@RequiresPermissions例如:

@RequiresPermissions({"file:read","write:aFile.txt"})
void someMethod();

要求 subject 中必须同时含有 file:readwrite:aFile.txt的权限能力执行办法someMethod()。否则抛出异样AuthorizationException

SpringSecurity

@Secured

办法级别的权限认证,只有被该注解指定的角色能力拜访该办法。

应用该注解须要开启注解性能,在配置类或者启动类上增加以下注解。

@EnableGlobalMethodSecurity(securedEnabled=true)

controller 办法上增加 @Secured 注解演示:

@GetMapping("user")
 // 设置只有这两种角色能力拜访这个办法
@Secured({"ROLE_admin","ROLE_admin_Pro"})
public String getUser() {return ".......";}

此时如果不是这两个角色其中之一拜访申请将被回绝。

@PreAuthorize

进入办法前的权限验证,同时也反对表达式的访问控制

要想应用该注解须要在 @EnableGlobalMethodSecurity 注解上增加 prePostEnabled = true属性

controller 办法上增加 @PreAuthorize 注解演示:

@GetMapping("user")
@PreAuthorize("hasAuthority('admin')")
public String getUser() {return ".......";}

此时如果不具备 manager 权限的拜访将会被回绝。

多个条件同时满足能够这样:

@PreAuthorize("hasAuthority('admin') and hasRole('admin_Pro')")

如果不能同时满足这两个条件,那么这个办法将不能拜访。

@PostAuthorize

同下面的注解一样,要开启此注解的性能须要在 @EnableGlobalMethodSecurity注解上增加 prePostEnabled = true属性。

@PostAuthorize注解的应用频率并不高,在办法执行之后再进行权限验证,适宜验证带有返回值的权限。

@PostFilter

在权限验证过后对数据进行过滤。

@PreFilter

进入控制器之前对数据进行过滤。

Spring Cache

@EnableCaching开启 Spring Cache 框架反对。解析对应的注解,实现缓存读写访问。

@CacheConfig缓存配置,能够配置以后类型中所用缓存注解的通用信息。

示例:配置当类前所有缓存注解的缓存前缀。

@CacheConfig(cacheNames = "cache:prefix")

@Cacheable示意要对办法返回值进行缓存。

蕴含属性:

  • cacheNames:缓存 key 前缀名字。
  • key:缓存 key 后缀。
  • condition : SpringEL表达式,后果为true,缓存数据到redis。后果为false,不缓存数据到redis
  • unlessSpringEL表达式,后果为false,缓存数据到redis。后果为true,不缓存数据到redis

@CacheEvict淘汰缓存注解。

蕴含属性:

  • allEntries代表是否删除 cacheNames 对应的全副的缓存。默认false,可选true
  • 注解属性和 Cacheable 类似。

@CachePut更新缓存,如果 key 存在笼罩缓存数据。key不存在,新增数据到缓存。

注解属性:跟 @Cacheable 类似。

完结

全篇完,其余注解请自行理解。

正文完
 0