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类似。

完结

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