一、常用注解说明
注解 | 说明 | 举例 |
---|---|---|
@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> |
@Component | Spring 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