Spring Boot常用注解

一、常用注解说明

注解说明举例
@Mapper@Mapper注解是MyBatis框架中的一个注解,它的作用是将一个Java接口标记为一个MyBatis的Mapper,使得这个接口可以被MyBatis框架自动扫描并生成对应的实现类。
@MapperScan如果多个接口都要变成实现类,那么需要在每个接口类上加上@Mapper注解,这样比较麻烦,我们通常会使用@MapperScan这个注解@MapperScan(value = {"com.example.demospringboot"})
public class DemospringbootApplication {
@Repository@Repository注解便属于最先引入的一批,它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean。具体只需将该注解标注在 DAO类上即可。// 首先使用 @Repository 将 DAO 类声明为 Bean:
package bookstore.dao;
@Repository
public class UserDaoImpl implements UserDao{ …… }
@Bean同时,为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能,这可以通过context:component-scan/实现// 其次,在 XML 配置文件中启动 Spring 的自动扫描功能:
<beans … >
……
<context:component-scan base-package=”bookstore.dao” />
……
</ beans>
@ComponentSpring 2.5 在 @Repository的基础上增加了功能类似的额外三个注解,它们分别用于软件系统的不同层次:
@Component 是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。
通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。
@Service@Service 通常作用在业务层,但是目前该功能与 @Component 相同。
@Controller
@Constroller 通常作用在控制层,但是目前该功能与 @Component 相同。
@Scope为了配合这四个注解,在标注 Bean 的同时能够指定 Bean 的作用域,Spring2.5 引入了 @Scope 注解。使用该注解时只需提供作用域的名称就行了@Scope(“prototype”)
@Repository
public class Demo { … }
@Configuration表明某个类是配置类@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
// instantiate, configure and return bean …
}
}
@ResponseBody将Controller的方法返回的对象,通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据
@RestController相当于@ResponseBody + @Controller合在一起的作用;无法返回jsp页面,返回的内容就是Return 里的内容
@RequestMapping用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上;@RequestMapping 的 value 属性必须设值,通过当前请求的请求地址来匹配请求;
@PostMapping处理post方式请求的映射
@GetMapping处理get方式请求的映射;相当于@RequestMapping(method=RequestMethod.GET),它会将get映射到特定的方法上
@Entity表示该类是一个实体类,在项目启动时会根据该类自动生成一张表,表的名称即@Entity注解中name的值,如果不配置name,默认表明为类名@Entity(name = “t_book”)
@Data注在类上,提供类的get、set、equals、hashCode、canEqual、toString方法@Setter : 注在属性上,提供 set 方法
@Getter : 注在属性上,提供 get 方法
@EqualsAndHashCode : 注在类上,提供对应的 equals 和 hashCode 方法
@NoArgsConstructor注在类上,提供类的无参构造@AllArgsConstructor : 注在类上,提供类的全参构造
@Table对应的数据表名。对象映射到数据库的数据表,通过它可以为实体指定表(table)
@Id主键
@GeneratedValue主键生成策略@Entity
@Data
@NoArgsConstructor
public class User {
@Id
@GeneratedValue
private Integer id;

}
@Log4j/@Slf4j注在类上,提供对应的 Logger 对象,变量名为 log
@Param一般用于mybatis中mapper与map.xml中的参数对应。其他:
@Insert (insert into xxxx) 增
@Delete (xxxx) 删
@Update (xxxx)改
@Select (xxxx)查

@Select("SELECT * FROM t_user WHERE USERNAME= #{username}")
User findByName(@Param(“username”) String name);
@Async在方法上加入这个注解,spring会从线程池中获取一个新的线程来执行方法,实现异步调用
@EnableAsync表示开启对异步任务的支持,可以放在springboot的启动类上,也可以放在自定义线程池的配置类上
@value用来注入外部化配置文件或者系统属性的值@Value(“${example.property}”)
private String exampleProperty;
@Transactional事务。例如测试用例执行到一半之后因为异常中断了,我们只需要在test函数上添加@Transactional注解即可自动回滚。此外,可以设置隔离级别@Transactional(isolation = Isolation.DEFAULT) 和 传播行为@Transactional(propagation = Propagation.REQUIRED)@Test
@Transactional
public void test() throws Exception {
// 省略测试内容
}

40 个最常用的 Spring Boot 注解
https://zhuanlan.zhihu.com/p/493854901?utm_id=0

二、自定义注解实现

1,创建自定义注解类

package com.example.demospringboot;
import org.springframework.stereotype.Component;
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface MyAnnotation {
    String value() default "";
}

@Target:注解的作用目标
@Target(ElementType.TYPE)——接口、类、枚举、注解
@Target(ElementType.FIELD)——字段、枚举的常量
@Target(ElementType.METHOD)——方法
@Target(ElementType.PARAMETER)——方法参数
@Target(ElementType.CONSTRUCTOR) ——构造函数
@Target(ElementType.LOCAL_VARIABLE)——局部变量
@Target(ElementType.ANNOTATION_TYPE)——注解
@Target(ElementType.PACKAGE)——包

@Retention:注解的保留位置
RetentionPolicy.SOURCE:这种类型的Annotations只在源代码级别保留,编译时就会被忽略,class字节码文件中不包含。
RetentionPolicy.CLASS:这种类型的Annotations编译时被保留,默认的保留策略,class文件中存在,JVM将会忽略,运行时无法获得。
RetentionPolicy.RUNTIME:这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射机制的代码所读取和使用。
@Document:说明该注解将被包含在javadoc中
@Inherited:说明子类可以继承父类中的该注解

代码解释参考:https://blog.csdn.net/D1842501760/article/details/124042500

2,利用反射获取注解:

package com.example.demospringboot;

import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.annotation.Rollback;

import org.springframework.transaction.annotation.Transactional;

import java.lang.reflect.Method;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
@Rollback(false)
@Slf4j
public class DemospringbootApplicationTests {

	@Test
	@MyAnnotation("hello")
	public void testMyAnnotation() throws Exception {
		Method method = this.getClass().getMethod("testMyAnnotation");
		MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);
		String value = annotation.value();
		log.info("MyAnnotation value: {}", value);
	}
}

如果要获得的注解是配置在方法上的,从Method对象上获取;
如果是配置在属性上,就需要从该属性对应的Field对象上去获取;
如果是配置在类型上,需要从Class对象上去获取。

也可与遍历获取,如:

	@MyAnnotation("test1")
	public void Test1() {}

	@MyAnnotation("test2")
	public void Test2() {}

	public void Test3() {}

	@Test
	public void testMyAnnotation() throws Exception {
		MyAnnotation annotation = null;
		String value = null;
		Method[] methods = this.getClass().getDeclaredMethods();
		for (Method method : methods) {
			annotation = method.getAnnotation(MyAnnotation.class);
			if (!Objects.isNull(annotation)) {
				value = annotation.value();
				log.info("method:{}, MyAnnotation value: {}", method.getName(), value);
			} else {
				log.info("method:{}, without MyAnnotation", method.getName());
			}
		}
	}

输出如下:

[           main] c.e.d.DemospringbootApplicationTests     : method:Test1, MyAnnotation value: test1
[           main] c.e.d.DemospringbootApplicationTests     : method:Test2, MyAnnotation value: test2
[           main] c.e.d.DemospringbootApplicationTests     : method:Test3, without MyAnnotation
[           main] c.e.d.DemospringbootApplicationTests     : method:testMyAnnotation, without MyAnnotation

参考:
https://www.cnblogs.com/zys2019/p/12075083.html?utm_source=tuicool

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值