本文共收录Spring注解几十个,都是常用的注解,每一个都有使用说明,应用实例及应用效果,看完让你编程实力与效率大增,绝对的功力修炼增强篇。由于篇幅太长,建议关注后,收藏备查。
目录
- Spring注解
- @Autowired
- @Aspect
- @Bean
- @Controller
- @Cacheable
- @CacheEvict
- @CachePut
- @Caching
- @Cleanup
- @CrossOrigin
- @Component
- @Configuration
- @ConfigurationProperties
- @ControllerAdvice(basePackages = "包路径")
- @ConditionalOnProperty(value = "",havingValue = "",matchIfMissing=true)
- @ConditionalOnBean
- @ConditionalOnMissingBean
- @ConditionalOnClass
- @ConditionalOnMissingClass
- @EnableDiscoveryClient
- @EnableGlobalMethodSecurity(prePostEnabled = true)
- @EnableFeignClients(basePackages = {"","",""})
- @EnableAsync
- @EnableCaching
- @EnableTransactionManagement
- @EnableJpaAuditing
- @EnableAspectJAutoProxy
- @EnableConfigurationProperties
- @EnableAutoConfiguration
- @EnableJpaRepositories(basePackages = {""}, repositoryFactoryBeanClass =)
- @EnableResourceServer
- @EnableScheduling
- @EnableWebSecurity
- @JsonFormat
- @ExceptionHandler(IllegalArgumentException.class)
- @FeignClient(name = "app-name",path = "/abc")
- @Nullable
- 实体注释
Spring注解
@Autowired
1、说明 对类成员变量、方法及构造函数进行标注。Spring框架会在该注释的变量、方法或构造函数为其找到按类型匹配的Bean并注入。在成员变量上使用时,需要把对应的getter,setter方法去掉。
该注解有个属性为required,可以配置为false,如果配置为false之后,当没有找到相应bean的时,系统不会抛错。
2、注意事项:使用该注释的成员变量要确保其类型只有一个实现。例如:接口或超类A,在项目中只有一个具体实现B。如果有B和C,则需配合@Qualifier使用。或使用@Service(name=“B”)
3、如何使用
@Aspect
1、说明:声明一个类为切面类。和@Component一起使用。可以使用@Order来决定切面类的优先处理顺序,数值越小越先执行。
2、注意事项:声明为切面的类,需创建切入点方法,并将方法标记为@Pointcut,同时创建切入点处理方法并标记为@Before,@Around,@AfterReturning,@After中的一种或几种。注意:在项目中使用多个Aspect类或有@ExceptionHandler时 ,当标记为@Around的处理方法有返回值时,不能将方法体内的处理过程使用try-catch/finnaly捕获异常,否则会出现意想不到的BUG(具体原理请参考spring-web处理过程,切面处理是优先于@ExceptionHandler的)。
3、如何使用:一般使用于日志记录,业务规则过滤,权限规则判断
@Aspect
@Component
@Order(1)
public class MyLogAspect {
@Pointcut("execution(public * abc.*.controller.*Controller.*(..))")
public void logPointCut() {
}
@Around("logPointCut()")
public Object doLogAround(ProceedingJoinPoint pjp) throws Throwable {
//....业务处理过程
try{//这里不应该使用try-finnaly或try-catch 否则
Object res = pjp.proceed();
return res;
}finnaly {}//这里不应该使用try-finnaly或try-catch 否则
}
}
切面使用原则:处理完所要处理的业务后原样返回,非必要不捕捉异常,不对参数/结果进行特别处理
,因为程序调用流程还要进行下去(生活还要继续下去,你能怎么办),如果别的切面拿到的参数被修改过了就会出问题。
@Bean
1、说明:是spring容器向程序提供的可自定义bean生成机制,它是方法级别上的注解,需与@Configuration、@Component共用。类被添加@Configuration及其方法添加@Bean注解,即向spring容器声明由此方法创建的bean交由spring容器管理。其它类可使用@Autowired或@Service要求spring容器注入此bean。
2、注意事项:当@Bean(name = “myname”)添加别名后,在只有一个实现类时,@Autowired,@Resource都无需指定别名自动装配
3、如何使用
@Controller
1、说明 定义一个控制器类。
2、注意事项:如不加@ResponseBody返回的是与该控制器类对应的视图路径。
3、如何使用 在类方法上与@RequestMapping一起使用。
在方法或在类上与 @ResponseBody使用,返回结果才能是JSON格式数据。
@Cacheable
1、说明 在标注的方法上使用缓存。使用cacheNames来命名缓存组,使用 key来指定key。例如: @Cacheable(cacheNames=“products”,key=“#id”)。使用传入方法的参数来作为key。
2、注意事项:需要在 SpringBoot 的主启动类开启缓存使用,即标注@EnableCaching。针对方法配置,能够根据方法的请求参数对其结果进行缓存
3、如何使用
//将pId作为缓存key,查询结果p放入到products名称的map里,即map(id,p)
@Cacheable(cacheNames="products",key="#pId")
public Product findById(Long pId){
Product p = productDao.get(pId);
return p;
}
@CacheEvict
1、说明 删除指定 key 的缓存数据条目。删除缓存value内key的对象/值
2、注意事项 针对方法配置,能够根据一定的条件对缓存进行清空
3、如何使用
@CacheEvict(value = {"products"},key="#pro.getId()")
public boolean deleteById(Product pro) {
return dao.removeById(id);
}
@CachePut
1、说明 更新缓存value里key的值。确保方法被执行,同时方法的返回值也被记录到缓存中,实现缓存与数据库的同步更新
2、注意事项 key = # 下例中表明执行参数。与Cacheable 不同的是,它每次都会触发真实方法的调用。
3、如何使用 如下例,返回对象Product 将以id=Product形式缓存
@CachePut(value="products",key="#product.getId()")
public Product loadProduct(Product product){
}
@Caching
1、说明 Cacheable,CacheEvict,CachePut的组合。适合于有两种以上不同的需求,都是放在同一个方法上。
2、注意事项
3、如何使用
@Caching(cacheable={@Cacheable(value="xxx", key="#id")},
put={@CachePut(value="XXX",key="#id")},
evict={@CacheEvict(value={"products"},key="#id")}
)
public void getXXXX(String id) {
return dao.getXXX(id);
}
@Cleanup
1、说明 Lombok的Cleanup。类似于在try catch 的 finally中关闭IO流资源。业务逻辑处理完后,会自动帮我们调用io.close()方法。如果io没有close()方法,则可以指定无参的方法。即MyInputStream 里有一个myclose()方法。
2、注意事项
3、如何使用 在IO声明前的一行标注
@Cleanup
InputStream in = new FileInputStream("");
或者
@Cleanup("myclose()")
MyInputStream myin = new MyFileInputStream("");
@CrossOrigin
1、说明 跨源资源共享,可以让程序员在控制器层方法中标注此方法为跨域资源,已经获得授权的登录者使用此资源。也可以标注在控制层类上,以表明该类下的所有方法都被定义为跨域资源。除了此之外Springcloud提供基于过滤器的CORS支持,提供更加通用性的跨源资源共享方案。如果各个系统使用同一单点登录的鉴权系统,那么使用跨域标注,可以省去再次登录的麻烦。
2、注意事项注意SpringMVC的版本要在4.2或以上版本才支持@CrossOrigin。
3、如何使用
@RestController
@RequestMapping("/user/my")
@CrossOrigin
public class MyController {
}
@Component
1、说明 将标注@Component注解的类交由spring管理
2、注意事项 有多个父子关系的类时可以指定名称,指定引入@Resource时注意要加上名称
3、如何使用
@Component("mythreadPool")
@Slf4j
public class ThreadPoolExecutorServiceHolder {
}
@Configuration
1、说明 配置类,应用启动后首先读取*.yml上的参数设置。需要在Application上添加@EnableAutoConfiguration或者添加@SpringBootApplication。与@PostConstruct()
使用起奇效
2、注意事项
3、如何使用 下例是读取*.yml不鉴权的URI。在init方法里也可以使用读取数据库的配置。读取到不鉴权的URI后可以设置spring security的参数
@Configuration
@Data
public class SystemConfig {
@Value("${security.oauth2.resource.ignore-uris}")
private String oauth2IgnoreUris;
public static String[] OAUTH2_SECURITY_IGNORE_URIS;
@PostConstruct()
public void init() {
List<String> uris = JSONArray.parseArray(this.getOauth2IgnoreUris(),String.class);
OAUTH2_SECURITY_IGNORE_URIS = uris.toArray(new String[uris.size()]);
}
}
///在ResourceServerConfig中设置非鉴权URI
.authorizeRequests().antMatchers(SystemConfig.OAUTH2_SECURITY_IGNORE_URIS).permitAll()//注意路径不要带webroot
@ConfigurationProperties
1、说明 该标注是让*.yml里的配置参数值,以对象的方式填到对象属性中,省缺@Value,用面向对象的概念读取配置参数值。比@Configuration更简洁
2、注意事项 yml参数与类属性必须按JAVA bean的规范
3、如何使用
*.yml参数
app:
my:
mobile: 123
name: 大象
@ConfigurationProperties(prefix="app.my")
@Data
@Component
public class Myelephtant{
private String mobile;
private String name;
}
@ControllerAdvice(basePackages = “包路径”)
1、说明 控制层拦截通知标注。定义一组控制层拦截规则,以及异常通知格式。说白了就是处理异常的通用方式
2、注意事项 不要在@Aspect标注的AOP处理类around,before等方法里catch异常,否则标注@ControllerAdvice的类无法捕获controller类抛出的异常。
3、如何使用
@Slf4j
@ControllerAdvice(basePackages = "com.my")
@RestController
public class ExceptionAdviceHandler {
@ExceptionHandler(Exception.class)
public Result<Void> BaseExceptionHandler(Exception e) {
log.error("未捕获异常:",e);
return Result.failure(ResultCode.ERROR,null,e.getMessage());
}
}
@ConditionalOnProperty(value = “”,havingValue = “”,matchIfMissing=true)
1、说明 控制配置类是否生效,可以将配置与代码进行分离,实现了更好的控制配置.
@ConditionalOnProperty实现是通过havingValue与配置文件中的值对比,返回为true则配置类生效,反之失效.
2、注意事项
3、如何使用
参考文章开发测试两不误,spring-cloud redis配置,动态切换redis集群单机环境的使用
@ConditionalOnBean
1、说明 当项目中存在某个类时才会使标有该注解的类或方法生效。标识在@Configuration类上,项目中存在@ConditionalOnBean中配置的类该Configuration类才会生效。@ConditionalOnBean标识在@Bean方法上,有只有存在@ConditionalOnBean中配置的类方法才会生效。
2、注意事项 注意自动配置类的先后顺序,可以通过@AutoConfigureBefore、@AutoConfigureAfter @AutoConfigureOrder控制先后顺序
3、如何使用
@Configuration
@ConditionalOnBean(value = {Product.class})
public class ProductConfig {
public ProductConfig (){
System.out.println("constructor ProductConfig ");
}
}
@ConditionalOnMissingBean
1、说明 与@ConditionalOnBean相反
2、注意事项
3、如何使用
@ConditionalOnClass
1、说明 当项目中存在某个类时才会使标有该注解的类或方法生效。标识在@Configuration类上,项目中存在@ConditionalOnClass中配置的类该Configuration类才会生效。@ConditionalOnClass标识在@Bean方法上,有只有存在@ConditionalOnClass中配置的类方法才会生效。
2、注意事项
3、如何使用
@ConditionalOnMissingClass
1、说明 与@ConditionalOnClass相反,当项目中不存在某个类时才会使标有该注解的类或方法生效。
2、注意事项
3、如何使用
@EnableDiscoveryClient
1、说明 开启注册中心发现组件。或者可以理解向注册中心注册服务,以便后继可以使用@FeignClient。开户注册服务时同时向spring框架指明扫描的包路径@EnableFeignClients(basePackages = “com.xx”)
2、注意事项
3、如何使用
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.xx.xx.xx")
public class MyApplication {
}
@EnableGlobalMethodSecurity(prePostEnabled = true)
1、说明 开启spring方法级安全,既可以在类上联合@Configuration,也可以注解在启动类上。这个注解为我们提供了prePostEnabled 、securedEnabled 和 jsr250Enabled 三种不同的机制来实现同一种功能。参数prePostEnabled = true 会解锁 @PreAuthorize 和 @PostAuthorize 两个注解。即你需在设置prePostEnabled = true后,才可以在任意类的方法上使用@PreAuthorize,@PostAuthorize,使用范例如下。其它开放的方法级安全注解还有@PreFilter,@PostFilter,@Secured以后详说。
2、注意事项
3、如何使用
//开启安全验证
@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableFeignClients(basePackages = "cn.xx")
public class MyApplication {
}
@Service
public class UserServiceImpl implements IUserService {
//必须有管理员角色才能更新
@PreAuthorize("hasRole('ROLE_ADMIN ')")
public Result<User> update(User user){
......
}
//有管理员角色和经理角色
@PreAuthorize("hasRole('ADMIN') AND hasRole('MANAGER')")
public Result<ResultCode> delete(int id){
...
}
}
@EnableFeignClients(basePackages = {“”,“”,“”})
1、说明 扫描指定包路径下所有有@FeignClient注解的类,将调用的请求发送给另外的微服务处理,是微服务的一种方式,不同于doubbo的一种云计算方式。
2、注意事项 注解在启动类上
3、如何使用
@EnableFeignClients(basePackages = "cn.xx")
public class MyApplication {
}
@EnableAsync
1、说明 开启异步处理功能,配合@Async使用。开启异步处理功能后@Async注解在类的方法上,表明该方法采用异常处理。
2、注意事项 注解在启动类上。注解@Async的方法真的是异步处理吗
3、如何使用
@Service
public class TestAsyncService {
/**异步处理*/
@Async
public void test(){
}
@EnableCaching
1、说明 开启缓存使用。后继配合@Cacheable在方法上使用,将返回结果存入缓存中
2、注意事项 注解在启动类上。一个提问:@Cacheable是将结果缓存在spring框架内存上还是缓存在redis上,如果是要缓存在spring框架的内存上如果处理?如果是缓存在redis上又要如何处理?@Cacheable的使用参数上面的说明。
3、如何使用
@EnableCaching
public class MyApplication {
}
@EnableTransactionManagement
1、说明 开启数据库事务管理。
2、注意事项 注解在启动类上。开启数据库事务管理后,在service层如果程序员try-catch了异常,那要重新抛出@Transactional指定的异常,否则事务不回滚,同时数据库要支持事务的引擎
3、如何使用
@EnableTransactionManagement
public class MyApplication {
}
//
@Service
public class UserServiceImpl implements IUserService {
@Transactional(rollbackOn=SystemException.class)
public Result<String> edit(User user) throws SystemException{
try{
......
} catch(Exception ex){
throw new SystemException(ex.getMessage());
}
}
}
@EnableJpaAuditing
1、说明 开启spring jpa的实体类审计功能,这个功能跟实体类属性被注解为@CreatedDate、@LastModifiedDate、@CreatedBy、@LastModifiedBy标签有关。如果实体类字段没有被以上四个标签注解则无效。
1、实体类上添加 @EntityListeners(AuditingEntityListener.class)
2、在相应字段加 @CreatedDate、@CreatedBy、@LastModifiedDate、@LastModifiedBy
3、启动类上添加 @EnableJpaAuditing
4、实现AuditorAware类,这个可选,如果这项没有则spring框架只会对@CreatedDate,@LastModifiedDate赋值。
2、注意事项 注解在启动类上
3、如何使用
@EntityListeners(AuditingEntityListener.class)
@Data
public abstract class AbstractAuditingEntity implements Serializable {
@CreatedBy
@Column(name = "created_by", nullable = false, length = 50, updatable = false)
private String createdBy;
@CreatedDate
@Column(name = "created_date", nullable = false)
private Date createdDate;
@LastModifiedBy
@Column(name = "last_modified_by", length = 50)
private String lastModifiedBy;
@LastModifiedDate
@Column(name = "last_modified_date")
private Date lastModifiedDate;
}
@Configuration
@Slf4j
public class DBAuditor implements AuditorAware<String> {
/**
* 获得当前登录用户,用用户名设置lastModifiedBy,createdBy,设置的操作由spring来做
* @return
*/
@Override
public Optional<String> getCurrentAuditor() {
UserDetails user;
try {
user = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return Optional.ofNullable(user.getUsername());
}catch (Exception e){
return Optional.empty();
}
}
}
@EnableJpaAuditing
public class MyApplication {
}
@EnableAspectJAutoProxy
1、说明 开启切面注解,如果不开启切面注解是不生效,也就是@Aspect不生效,但springboot已帮开发者完成。如下图*.yml按@ConditionalOnProperty的参数配置即可
2、注意事项 注解启动类后。@Aspect就可以添加在自己写的切面类上。
3、如何使用 按@Aspect使用
@EnableConfigurationProperties
1、说明 开启配置参数转化为bean对象与@ConfigurationProperties配合使用。@EnableConfigurationProperties({Myelephtant.class}) 注解使ConfigurationProperties注解生效。请查看@ConfigurationProperties的使用。然后Myelephtant就可以 @Autowrited形式用在别的类上
2、注意事项 注解在启动类上
3、如何使用
@EnableDiscoveryClient
@EnableConfigurationProperties({Myelephtant.class})
public class MyApplication {
}
@EnableAutoConfiguration
1、说明 自动装配配置类,@ConfigurationProperties配合使用。自动实例化系统参数。也就是说利用EnableAutoConfiguration,使用者可以在项目启动时自动实例化一些参数或类,类似于nacos-client.jar下的自动装配
2、注意事项 注解在启动类上
3、如何使用
@EnableJpaRepositories(basePackages = {“”}, repositoryFactoryBeanClass =)
1、说明 开启自定义的JPA配置参数,覆盖spring的缺省JPA配置。basePackages 指定实体类的包路径,可以是数组。repositoryFactoryBeanClass指定实体类相应的Dao工厂类,这个工厂类可以是程序员自己实现的。
2、注意事项 注解在启动类上。注意自己写的JpaConfiguration类不要脱离spring框架下的数据库线程池管理机制,否则会引起数据库8小时超时异常,即不需要自己管理DataResource。
3、如何使用 添加在启动类上
@EnableResourceServer
1、说明 开启资源提供服务的配置。会根据登录token实施资源授权鉴别,被放入antMatchers的http请求将不会实施鉴别。
2、注意事项 Spring Boot 从 2.3 升级到 2.4 的时候提示会被丢弃。Spring-security-Oauth2要求迁移到spring-security框架中,从而实施更为精细化的鉴权业务。新的spring-security使用此处不宜展开,使用细节太多,将使用验证后择机发文。
3、如何使用
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.exceptionHandling()
.authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED))
.and()
.authorizeRequests()
.antMatchers(IGNORE_URIS).permitAll()
.anyRequest().authenticated()
//跨域配置
.and().cors().configurationSource(request -> {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedOrigin(request.getHeader("Origin"));
corsConfiguration.addAllowedMethod("*");
corsConfiguration.setAllowCredentials(true);
corsConfiguration.setMaxAge(3600L);
return corsConfiguration;
});
}
}
@EnableScheduling
1、说明 开启定时任务功能。开启后即可在具体类方法上添加 @Scheduled(cron = "0 */1 * * * * ") 来实现方法的定时执行
2、注意事项 在springboot启动类上加@EnableScheduling。或在config类上加@Component @Configurable @EnableScheduling
3、如何使用
@Component
@Configurable
@EnableScheduling
public class ScheduledTasks {
//每分钟执行一次
@Scheduled(cron = "0 */1 * * * * ")
public void reportCurrentTime(){
System.out.println ("我的任务");
}
}
@EnableWebSecurity
1、说明 开启SpringSecurity组件功能。需要导入SpringSecurity相关包。SpringSecurity组件的使用细节不在这里述说。看官可以在CSDN其他文章学习
2、注意事项 注解在启动类上
3、如何使用 暂无
@JsonFormat
1、说明 JSON映射对象时,用于格式化入参。例如日期,可与fastjson的JSONField一起使用
2、注意事项 给出pattern规则。如果是日期属性,在中国地区应该加上timezone=“GMT+8”。
3、如何使用 下例是以RFC3339标准的日期入参
//{"create_at": "2020-12-01T00:00:00+08:00"}
@JSONField(alternateNames= {"create_at"})
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssXXX",timezone="GMT+8")
private Date createAt;
@ExceptionHandler(IllegalArgumentException.class)
1、说明
2、注意事项 注解在启动类上
3、如何使用
@FeignClient(name = “app-name”,path = “/abc”)
@Nullable
1、说明
用在参数、返回值和字段,说明该参数,返回值、字段可以为空。可以与@NonNullApi或@NonNullalFields关联使用
2、注意事项
3、如何使用
@Nullable
private EntityManagerFactory entityManagerFactory;
public static <K, V> void mergePropertiesIntoMap(@Nullable Properties props, Map<K, V> map) {
if (props != null) {
for (Enumeration<?> en = props.propertyNames(); en.hasMoreElements();) {
String key = (String) en.nextElement();
Object value = props.get(key);
if (value == null) {
// Allow for defaults fallback or potentially overridden accessor...
value = props.getProperty(key);
}
map.put((K) key, (V) value);
}
}
}
public static Object[] toObjectArray(@Nullable Object source) {
if (source instanceof Object[]) {
return (Object[]) source;
}
if (source == null) {
return EMPTY_OBJECT_ARRAY;
}
....
}
从代码上看,“可以为空”这个语义的意思是在方法体内,如果参数不为空程序员需处理参数。参数如果为空,不作任何处理
实体注释
@Id
@GenericGenerator(name=“snowFlakeIdGenerator”, strategy=“cn.suitong.core.data.support.SnowFlakeIdGenerator”)
@GeneratedValue(generator=“snowFlakeIdGenerator”)
@JsonSerialize(using = ToStringSerializer.class)
@Column(name = “id”,columnDefinition = “bigint(20) COMMENT ‘商户ID’”)
@NotNull(message=“水费单价不能为空,格式:##.##”)
@Size(min=1, max=5)
@DecimalMin(value=“0”,message=“必须是大于0的数”)
@Column(name = “water_unit_price”)
@Convert(converter = ColumnRMBYuanToFenConverter.class)
@Transient