JAVA开发常用框架注解与作用
一起交流:CN.ITLTT.COM
Spring全家桶
声明Bean
@Component
组件,没有明确的角色。@Service
在业务逻辑层使用->Service层。[email protected]
在数据访问层使用->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
里声明了有哪些自动配置
+@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: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
相似。
结束
全篇完,其他注解请自行了解。