JAVA开发常用结构注解与效果

一同交流:CN.ITLTT.COM

一篇带你了解Java开发中常用的注解与作用

Spring全家桶

声明Bean

  • @Component组件,没有明确的人物。
  • @Service在业务逻辑层运用->Service层。
  • D@Repository在数据拜访层运用->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类似。

完毕

全篇完,其他注解请自行了解。