当前位置: 首页 > 后端技术 > Java

一篇带你了解Java开发中常用注解和函数的文章

时间:2023-04-01 16:45:34 Java

JAVA开发常用框架注解和函数一起交流:CN.ITLTT.COMSpring全家桶声明Bean@Component组件,角色不明确。@Service用在业务逻辑层->服务层。D@Repository在数据访问层使用->Dao层。@Controller用在表现层,控制器的声明。Bean的注入@Autowired由Spring提供,根据类型自动组装。如果使用@Qualifier的组合,则按名称进行组装。@Inject由JSR-330提供。使用时需要引入javax.inject.Inject来实现注入。它也是根据类型自动组装的。如果需要按名字组装,需要配合@Named。@Resource由JSR-250提供。如果需要导入javax.annotation,根据name进行自动组装,一般会指定一个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。在Requestweb项目中,为每个http请求创建一个新的bean。在会话Web项目中,为每个http会话创建一个新的bean。GlobalSession(为每个全局http会话创建一个Bean实例。类生命周期相关的@PostConstruct是JSR-250提供的,在类构造器执行完之后执行,相当于xml配置文件中bean的initMethod。@PreDestory由JSR-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通过设置Environment的ActiveProfiles来设置当前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声明这是一个任务,包括cron、fixDelay、fixRate等类型。开启一些特性@EnableAspectJAutoProxy开启对AspectJ自动代理的支持。@EnableAsync启用对异步方法的支持。@EnableScheduling启用对计划任务的支持。@EnableWebMvc启用对WebMVC的配置支持。@EnableConfigurationProperties启用对使用@ConfigurationProperties注释的配置bean的支持。@EnableJpaRepositories启用对SpringDataJPARepository的支持。@EnableTransactionManagement启用对注释事务的支持。@EnableCaching启用注解式缓存支持。测试相关的@RunWithSpring通常用于支持JUnit。@ContextConfiguration用于加载配置ApplicationContext。@Test用于单元测试。MVC相关的@RequestMapping用于映射web请求,包括访问路径和参数。ResponseBody支持将返回值放在响应中而不是页面中。@PathVariable用于接收路径参数。@RestController这个注解是一个组合注解,相当于@Controller和@ResponseBody的组合。注解在类上,也就是说Controller的所有方法都默认加上了@ResponseBody。@ControllerAdvice通过这个注解,我们可以把controller的全局配置放在同一个位置,用@Controller注解的类的方法可以注解到有@ExceptionHandler、@InitBinder、@ModelAttribute的方法,这样对所有注解@RequestMapping的控制器内部的方法都起作用。@ExceptionHandler用于全局处理控制器中的异常。@InitBinder用于设置WebDataBinder,WebDataBinder用于自动绑定前端请求参数到Model。@ModelAttribute的原始功能是将键值对绑定到Model。在@ControllerAdvice中,全局的@RequestMapping可以获得这里设置的键值对。引导相关的@EnableAutoConfiguration自动加载应用程序需要的所有bean。该注解结合了@Import注解,该注解引入了EnableAutoConfigurationImportSelector类,该类使用SpringFactoriesLoader.loaderFactoryNames方法扫描带有META-INF/spring.factories文件的jar包。而spring.factories声明了有哪些自动配置+@SpingBootApplication是SpringBoot的核心注解,主要目的是开启自动配置。也是组合注解,主要结合了@Configurer、@EnableAutoConfiguration(核心)和@ComponentScan。可以通过@SpringBootApplication(exclude={要关闭的自动配置的类名.class})关闭特定的自动配置。@ImportResource加载xml配置。@AutoConfigureAfter在指定的自动配置类之后进行配置。MyBatisSQL语句映射@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(Objectother)和hashcode()方法,包括所有非静态变量和非瞬态变量。@NoArgsConstructor、@AllArgsConstructor和@RequiredArgsConstructor非常相似。都是自动生成这个类的构造函数。唯一的区别是生成的构造函数的参数不同。@NoArgsConstructor生成一个没有参数的构造函数。@AllArgsConstructor生成一个包含所有参数的构造函数。@RequiredArgsConstructor生成一个包含“特定参数”的构造函数,这些参数是那些带有final修饰符的变量。注意:这里注意Java的一个小坑。当我们不指定构造函数时,Java编译器会自动为类生成一个不带任何参数的构造函数,但是如果我们自己编写构造函数,Java不会自动为我们填充无参构造函数。但是在很多地方(比如SpringDataJPA),每个类都必须有一个无参构造函数,所以在添加@AllArgsConstructor的时候,一定要添加@NoArgsConstrcutor,不然会有各种坑等等看着你。@Data:集成包,只要加上@Data注解,就相当于同时加上了下面的注解。@Getter/@Setter@ToString@EqualsAndHashCode@RequiredArgsConstructor@Value:集成包,但是他会把所有的变量设置为final,其他和@Data一样,也就是同时加上下面的注解。@Getter(无setter)@ToString@EqualsAndHashCode@RequiredArgsConstructor@Builder:自动生成流式set值写入方法,以后不用写一堆setter了。注意,虽然我们可以通过添加@Builder注解快速流畅地设置对象的值,但是setter还是必须要写的,不能省略,因为Spring或者其他框架使用对象的getters/setter来获取/赋值它们,所以通常@Data和@Builder会在同一个类上一起使用,方便我们在流中写代码,方便框架做事。@Slf4j:该类的log静态常量是自动生成的,想打log直接打log即可,无需手动新建log静态常量。除了@Slf4j,lombok还提供了其他日志框架的变体注解,比如@Log、@Log4j等,它们都是帮助我们创建静态常量日志,只是使用的库不同而已。@Log//对应的日志语句如下privatestaticfinaljava.util.logging.Loggerlog=java.util.logging.Logger.getLogger(LogExample.class.getName());@Log4j//对应的日志语句如下privatestaticfinalorg.apache.log4j.Loggerlog=org.apache.log4j.Logger.getLogger(LogExample.class);SpringBoot默认支持slf4j+logback的日志框架,所以不需要再做任何设置,在SpringBoot项目中使用即可,最常用的日志系列注解是@Slf4j。Shiro@RequiresAuthentication验证用户是否登录,相当于方法subject.isAuthenticated()的结果为真时。@RequiresUser验证用户是否被记住。user有两种含义:一种是登录成功(subject.isAuthenticated()为true)。另一个被记住(subject.isRemembered()为真)。@RequiresGuest验证是否是访客请求,与@RequiresUser正好相反。换句话说,RequiresUser==!RequiresGuest。此时subject.getPrincipal()的结果为null。@RequiresRoles例如:@RequiresRoles("JanYork");无效的一些方法();仅当主题中有JanYork角色时,才能访问方法someMethod。如果没有该权限,将抛出异常AuthorizationException。@RequiresPermissions例如:@RequiresPermissions({"file:read","write:aFile.txt"})voidsomeMethod();要求主题必须同时包含file:read和write:aFile.txt权限才能执行方法someMethod()。否则抛出异常AuthorizationException。SpringSecurity@Secured:方法级别的授权认证,只有注解指定的角色才能访问该方法。使用该注解需要开启注解功能,并在配置类或启动类中添加如下注解。@EnableGlobalMethodSecurity(securedEnabled=true)在控制器方法上添加@Secured注解演示:@GetMapping("user")//设置只有这两个角色可以访问该方法@Secured({"ROLE_admin","ROLE_admin_Pro"})publicStringgetUser(){return".......";}此时,如果不是这两个角色之一,访问请求将被拒绝。@PreAuthorize:进入方法前的权限验证,也支持表达式的权限控制。要使用该注解,需要在@EnableGlobalMethodSecurity注解中添加prePostEnabled=true属性。将@PreAuthorize注释添加到控制器方法。演示:@GetMapping("user")@PreAuthorize("hasAuthority('admin')")publicStringgetUser(){return"......";}这时候如果你没有manager权限,访问将被拒绝。可以同时满足多个条件:@PreAuthorize("hasAuthority('admin')andhasRole('admin_Pro')")如果不能同时满足这两个条件,那么这个方法将无法访问。@PostAuthorize:和上面的注解一样,要开启这个注解的功能,需要在@EnableGlobalMethodSecurity注解中加上prePostEnabled=true属性。@PostAuthorize注解使用频率不高,在方法执行后进行权限校验,适用于有返回值的权限校验。@PostFilter:授权校验后过滤数据。@PreFilter:在进入控制器之前过滤数据。SpringCache@EnableCaching启用SpringCache框架支持。解析对应的注解,实现缓存读写访问。@CacheConfig缓存配置,可以配置当前类型使用的缓存注解的通用信息。示例:配置当前类之前所有缓存注解的缓存前缀。@CacheConfig(cacheNames="cache:prefix")@Cacheable表示缓存方法的返回值。包含属性:cacheNames:缓存键前缀名。key:缓存键后缀。condition:SpringEL表达式,结果为真,缓存数据到redis。结果为false,不缓存数据到redis。unless:SpringEL表达式,结果为false,缓存数据到redis。结果为真,不缓存数据到redis。@CacheEvict消除缓存注解。include属性:allEntries表示是否删除所有cacheNames对应的缓存。默认false,可选true。注解属性类似于Cacheable。@CachePut更新缓存并在键存在时覆盖缓存的数据。键不存在,向缓存中添加数据。注解属性:类似于@Cacheable。整篇文章到此结束,其他注意事项请自行理解。