JAVA开发常用结构注解与效果
一同交流:CN.ITLTT.COM
Spring全家桶
声明Bean
@Component组件,没有明确的人物。@Service在业务逻辑层运用->Service层。D@Repository在数据拜访层运用->Dao层。@Controller在展示层运用,操控器的声明。
注入Bean
@Autowired由Spring供给,依据类型进行主动安装,假如组合@Qualifier运用将按称号进行安装。@Inject由JSR-330供给运用时需求导入javax.inject.Inject完成注入同样是依据类型进行主动安装,假如需求按称号进行安装,则需求配合@Named。@Resource由JSR-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生命周期相关
@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敞开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用来设置WebDataBinder,WebDataBinder用来主动绑定前台恳求参数到Model中。@ModelAttribute原本的效果是绑定键值对到Model里,在@ControllerAdvice中是让大局的@RequestMapping都能取得在此处设置的键值对。
Boot相关
@EnableAutoConfiguration主动载入运用程序所需的一切Bean。该注解组合了@Import注解,@Import注解导入了EnableAutoCofigurationImportSelector类,它运用SpringFactoriesLoader.loaderFactoryNames办法来扫描具有META-INF/spring.factories文件的jar包。而spring.factories里声明晰有哪些主动装备 +@SpingBootApplicationSpringBoot的核心注解,主要意图是敞开主动装备。它也是一个组合注解,主要组合了@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:read和write: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。unless:SpringEL表达式,成果为false,缓存数据到redis。成果为true,不缓存数据到redis。
@CacheEvict筛选缓存注解。
包括特点:
allEntries代表是否删除cacheNames对应的悉数的缓存。默许false,可选true。- 注解特点和
Cacheable类似。
@CachePut更新缓存,假如key存在覆盖缓存数据。key不存在,新增数据到缓存。
注解特点:跟
@Cacheable类似。
完毕
全篇完,其他注解请自行了解。

