Java开发核心注解总结(一)

一、注解目录

我一共分了四篇写完了平时用到的注解,主要涵盖了Lombok、Java、Spring、SpringBoot、Mybatis、Swagger的部分注解,有一些不常用的我就没列举,可能会有遗漏的,大家遇到再百度吧。主要目录如下:

Java开发核心注解总结(一)

Lombok核心注解总结(二)

Mybatis核心注解总结(三)

Swagger核心注解总结(四)

二、何为注解?

身为一个Java小菜鸟,我最近在开发项目的时候,遇到了很多的注解,使用注解很方便,节省了很多的代码,提高了开发的效率,但有很多的注解还不太理解,在网上找的注解的文章,看得人眼花缭乱。所以我就自己动手记录下用的注解,并且加入注解解释和在哪个地方使用该注解有何作用,奥利给!

Java注解(Annotation) 是从JDK5.0开始引入的新技术,Java 语言中的类、方法、变量、参数和包等都可以被标注。我们可以通过反射机制实现对这些元数据的访问。

注解的格式:

  • 注解是以"@注释名"在代码中存在的
  • 注解可以添加一些参数值 , 例如:@RequestMapping("/delete")

三、Java、spring、spring Boot注解

由于注解比较多,我水平还不够,小菜鸟一枚,这里就不展开说原理之类的东西了,我只说明有何作用和基本的注解代码使用。

1、@SpringBootApplication

作用: 这个是Spring Boot 最最核心的注解了,用在项目的启动类上,说明这是一个Spring Boot项目,开启Spring Boot开发的各个功能。(常用)

其中这个注解包含了@EnableAutoConfiguration@ComponentScan@Configuration,可以用这三个注解组合来代替@SpringBootApplication的功能。

应用代码:

@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

2、@EnableAutoConfiguration

作用: 启用 Spring Boot 的自动配置机制,帮助Spring Boot应用将所有符合条件的@Configuration配置都加载到当前Spring Boot,并创建对应配置类的Bean,并把该Bean实体交给IOC容器进行管理。(常用)

应用代码:

@EnableAutoConfiguration
@ComponentScan
@Configuration
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

3、@ComponentScan

作用:@ComponentScan 注解类,使得 Spring 去扫描指定包路径下面的类,找到标注有@Component@Controller@Service@Repository 注解的类,将这些类自动加载到 Spring 容器中。用于代替Spring的xml配置文件中的<context:componet-scan base-package=""/>(不常用)

应用代码:

@Configuration
@ComponentScan(value = "com.dao",excludeFilters={@Filter(type=FilterType.ANNOTATION,value=Service.class)})
public class Config {
}

通过对属性 includeFilters 和 excludeFilters 的设置,可以有对于类型有一个筛选功能。includeFilters 指定了哪些类才能被扫描到,excludeFilters 则相反,指定了哪些类得排除扫描。例如上述代码功能是标注有@Service 注解的类,会被排除,不会被加载到 Spring 容器中。

4、@Configuration

作用: 在Spring 3.0以后,@Configuration用于定义配置类,可替换xml配置文件,所有在配置文件里面能做到的事情都可以通过这个注解所在类来进行注册,配置spring容器(常用)

@Configuration注解的配置类有如下要求:

  1. @Configuration不可以是final类型;
  2. @Configuration不可以是匿名类;
  3. @Configuration不可以是匿名类;
  4. 嵌套的configuration必须是静态类。

应用代码:

@Configuration
public class Config {
    public Config(){
        System.out.println("Config 容器启动初始化...");
    }
}

相当于:

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">
 
</beans>

5、@Controller

作用:@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller只是定义了一个控制器类,而使用@RequestMapping注解的方法才是处理请求的处理器。(常用)

应用代码:

@Controller
public class BookController{
	
	@RequestMapping(value="/list")
	public String bookList() {
		return "200";
	}
}

6、@RestController

作用: 相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。(常用)

应用代码:

@RestController /* @Controller + @ResponseBody*/
public class BookController {

    @Autowired
    BookService bookService;
    
    @RequestMapping(value="/list")
	public String bookList() {
		List<Book> bookList= bookService.findAllBook();
        return bookList;
	}
}

7、@Service

作用: 注解属于业务逻辑层,service或者manager层。其getBean的默认名称是类名(头字母小写),可以@Service(“xxxx”)这样来指定,定义的bean默认是单例的,可以使用@Service(“beanName”)@Scope(“prototype”)来改变。可以通过@PostConstruct@PreDestroy指定初始化方法和销毁方法(方法名任意)。(常用)

应用代码:

@Service("bookService")
public class BookServiceImpl implements BookService{
 
}

8、@Autowired

作用:@Autowired是一种注解,可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,@Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上,也可以放在任意方法上表示,自动执行当前方法,如果方法有参数,会在IOC容器中自动寻找同类型参数为其传值。(常用)

应用代码:

@RestController
public class BookController {

    @Autowired
    BookService bookService;
    
    @RequestMapping(value="/list")
	public String bookList() {
		List<Book> bookList= bookService.findAllBook();
        return bookList;
	}
}

9、@PathVariable

作用:@PathVariable是spring3.0的一个新功能:接收请求路径中占位符的值。通过@PathVariable 可以将URL中占位符参数{xxx}绑定到处理器类的方法形参中@PathVariable(“xxx“)。(常用)

例如:

@RequestMapping(value=”book/{id}/{name})
请求路径:http://localhost:8080/xyh/book/3/name*

应用代码:

@Controller
@RequestMapping("book")
public class BookController {
   
    @RequestMapping("xyh/{id}/{name}")
    public ModelAndView bookList(@PathVariable("id") Long ids ,@PathVariable("name") String names){
        ModelAndView mv = new ModelAndView();
        mv.addObject("msg","占位符映射:id:"+ids+";name:"+names);
        mv.setViewName("hello2");
        return mv;
    }
}

10、@PostMapping

作用: 映射一个POST请求,写在接口层的方法上,用于前端post请求,可以加value属性设置请求地址路径。(常用)

应用代码:

@PostMapping(value = "/book/list")
public String bookList() {
		List<Book> bookList= bookService.findAllBook();
        return bookList;
}

等价于:

@RequestMapping(value = "/book/list", method = RequestMethod.POST)
public String bookList() {
		List<Book> bookList= bookService.findAllBook();
        return bookList;
}

11、@GetMapping

作用:@PostMapping用法一样,映射一个GET请求,写在接口层的方法上,用于前端GET请求,可以加value属性设置请求地址路径。(常用)

应用代码:

@GetMapping(value = "/book/list")
public String bookList() {
		List<Book> bookList= bookService.findAllBook();
        return bookList;
}

等价于:

@RequestMapping(value = "/book/list", method = RequestMethod.GET)
public String bookList() {
		List<Book> bookList= bookService.findAllBook();
        return bookList;
}

12、@RequestMapping

作用:@RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。(常用)

@RequestMapping共有6个属性。

  • value: 指定请求的实际地址,指定的地址可以是URI Template 模式。

  • method: 指定请求的method类型, GET、POST、PUT、DELETE等。

  • consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html。

  • produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回。

  • params: 指定request中必须包含某些参数值是,才让该方法处理。

  • headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。

应用代码:

 @RequestMapping(value="/delet", method = RequestMethod.POST)
 public Result deletBook() {
      return new DeletBook();
 }

13、@RequestBody

作用: 注解@RequestBody接收的参数是来自RequestBody中,即请求体。一般用于处理非 Content-Type: application/x-www-form-urlencoded编码格式的数据,比如:application/jsonapplication/xml等类型的数据。(常用)

application/json类型的数据而言,使用注解@RequestBody可以将body里面所有的json数据传到后端,后端再进行解析。

GET请求中,因为没有HttpEntity,所以@RequestBody并不适用。

应用代码:

@RequestMapping(value = "/book/list", method = RequestMethod.POST)
public String bookSelect(@RequestBody String name) {
        return name;
}

14、@ResponseBody

作用: 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定 到要返回的对象上。(常用)

再把converter返回的对象数据绑定到 controller中方法的参数上。

应用代码:

@ResponseBody
public Object login(@RequestBody User loginUuser, HttpSession session) {
	user = userService.checkLogin(loginUser);
	session.setAttribute("user", user);
	return new JsonResult(user);
}

15、@RequestParam

作用: @RequestParam主要用于将请求参数区域的数据映射到控制层方法的参数上。(一般)

一共包含三个属性:

  • value:请求中传入参数的名称,如果不设置后台接口的value值,则会默认为该变量名。比如上图中第一个参数如果不设置value=“page”,则前端传入的参数名必须为pageNum,否则在后台接口中pageNum将接收不到对应的数据

  • required:该参数是否为必传项。默认是true,表示请求中一定要传入对应的参数,否则会报404错误,如果设置为false时,当请求中没有此参数,将会默认为null,而对于基本数据类型的变量,则必须有值,这时会抛出空指针异常。如果允许空值,则接口中变量需要使用包装类来声明。

  • defaultValue:参数的默认值,如果请求中没有同名的参数时,该变量默认为此值。注意默认值可以使用SpEL表达式,如"#{systemProperties[‘java.vm.version’]}"

应用代码:

@RequestMapping("show18")
public Result book1(@RequestParam(value="name",required=true,defaultValue="Spring Boot")String name){
        return "成功";
}

16、@Valid

作用: 用于验证注解是否符合要求,直接加在方法参数之前,在变量中添加验证信息的要求,当不符合要求时就会在方法中返回错误提示信息。(常用)

应用代码:

@RestController
@RequestMapping("/user")
public class UserController {
    @PostMapping
    public User create (@Valid @RequestBody User user) {
        System.out.println(user.getId());
        System.out.println(user.getUsername());
        System.out.println(user.getPassword());
        return user;
    }
}

17、@Reponsitory

作用: 使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。如果是Mybatis项目,则使用注解在Mapper类上加@Reponsitory或者@Mapper都可以。(常用)

应用代码:

@Repository
public interface BookMapper{
    
    List<Book> findAllByCategory(Category category);
 
}

18、@Component

作用:(把普通pojo实例化到spring容器中,相当于配置文件中的 )泛指组件,就是说当我们的类不属于各种归类的时候(不属于@Controller@Services等的时候),我们就可以使用@Component来标注这个类。(一般)

应用代码:

@Component("bookImpl")
//其实默认的spring中的Bean id 为 bookImpl(首字母小写)
public class BookImpl implements BookService {
    @Autowired
    private RedisClient redisClient;
    // ......
}

19、@Bean

作用:@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名。(一般)

应用代码:

@Configuration
public class AppConfig {

    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }

相当于:

<beans>
    <bean id="transferService" class="com.acme.TransferServiceImpl"/>
</beans>

20、@JsonIgnore

作用: 在json序列化时将pojo中的一些属性忽略掉,标记在属性或者方法上,返回的json数据即不包含该属性。(不常用)

应用代码:

public class User {
    private Long id;
    private String username;// 用户名
    @JsonIgnore
    private String password;// 密码
}

21、@Qualifier

作用: 在使用@Autowire自动注入的时候,加上@Qualifier(“test”)可以指定注入哪个对象,可以作为筛选的限定符,我们在做自定义注解时可以在其定义上增加@Qualifier,用来筛选需要的对象。(不常用)

应用代码:

@RestController
public class TestController {

    //此时这两个注解的连用就类似 @Resource(name="testClass1")
    @Autowired
    @Qualifier("testClass1")
    private TestClass testClass;

    @GetMapping("/test")
    public Object test(){
        return testClassList;
    }
}

22、@Override

作用:@Override是伪代码,表示重写。(当然不写@Override也可以),最好要写上。(常用)

有以下好处:

  • 可以当注释用,方便阅读。
  • 编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名又写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。

应用代码:

//正确写法
@Override
public void onCreate(Bundle savedInstanceState){
    ......
}

//编译器会报如下错误:The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以确保你正确重写onCreate方法(因为oncreate应该为onCreate)。
@Override
public void oncreate(Bundle savedInstanceState){
   ......
}

23、@Value

作用: 通过注解将常量、配置文件中的值、其他bean的属性值注入到变量中,作为变量的初始值。(常用)

应用代码:

@Value("http://www.xyhwh.cn")
private Resource testUrl; // 注入URL资源

24、@ControllerAdvice

作用: 包含@Component。可以被扫描到。统一处理异常。这是一个增强的 Controller。使用这个 Controller ,可以实现三个方面的功能:(一般)

  1. 全局异常处理
  2. 全局数据绑定
  3. 全局数据预处理

应用代码:

//全局异常处理
@RestControllerAdvice
public class AppControllerAdvice {

    private static Logger log = LoggerFactory.getLogger(AppControllerAdvice.class);

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @ResponseBody
    @ExceptionHandler
    String exceptionHandler(MediationException exception) {
      //统一处理异常,返回规定的json格式
        return JsonUtil.object2Json(Result.fail(exception.getCode(), exception.getMessage()));
    }
}

25、@Scheduled

作用: 注解@Scheduled可以作为一个触发源添加到一个方法中。(不常用)

例如,以下的方法将以一个固定延迟时间5秒钟调用一次执行,这个周期是以上一个调用任务的完成时间为基准,在上一个任务完成之后,5s后再次执行.

应用代码:

@Scheduled(fixedDelay = 5000)
public void doSomething() { 
// something that should execute periodically
}

如果简单的定期调度不能满足,那么cron表达式提供了可能

@Component
public class TaskDemo {

	@Scheduled(cron = "0 0 2 * * ?")  //每天凌晨两点执行
	void doSomethingWith(){
		logger.info("定时任务开始......");
		long begin = System.currentTimeMillis();
		//执行数据库操作了哦...
		long end = System.currentTimeMillis();
		logger.info("定时任务结束,共耗时:[" + (end-begin) / 1000 + "]秒");
	}
}

Cron表达式网站生成: http://cron.qqe2.com/

26、@EnableScheduling

作用: SpringBoot定时任务。相当于闹钟,在什么时间做什么事情。(一般)

应用代码:

//启动类里面使用@EnableScheduling 注解开启功能,自动扫描
@SpringBootApplication
@EnableScheduling //开启定时任务
public class MainApplication {

    public static void main(String[] args) {
        SpringApplication.run(MainApplication.class, args);
    }
}
//新建一个类
//要在任务的类上写@Component
//要在任务方法上写@Scheduled
@Component
public class Books {

    //表示每隔3秒
    @Scheduled(fixedRate = 3000)
    public void fixedRateBook() {

        System.out.println("fixedRate 每隔3秒" + new Date());
    }

    //表示每天8时30分0秒执行
    @Scheduled(cron = "0 0,30 0,8 ? * ? ")
    public void cronBook() {
        System.out.println(new Date() + " ...>>....");
    }
}

27、@PreDestory

作用:@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。(不常用)

应用代码:

@PreDestroy
public void otherMethod(){
	System.out.println("时间:"+df.format(new Date())+"执行@PreDestroy修饰的otherMethod()方法...");
}

28、@PostConstruct

作用:@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。(一般)

应用代码:

@PostConstruct
public void someMethod(){
   //this.log("执行@PostConstruct修饰的someMethod()方法...");//注意:这样会出错
   System.out.println("时间:"+df.format(new Date())+"执行@PostConstruct修饰的someMethod()方法...");
}

29、@Reference

作用:@Reference是dubbo的注解,也是注入,他一般注入的是分布式的远程服务的对象,需要dubbo配置使用。(常用)

应用代码:

@Reference(version = "1.0.0", application = "${dubbo.application.id}")
private BookService bookService;

30、@Transactional

作用:@Transactional 是声明式事务管理 编程中使用的注解。@Transactional 注解只能应用到 public 方法才有效。(一般)

  • 接口实现类或接口实现方法上,而不是接口类中。
  • 访问权限:public 的方法才起作用。@Transactional 注解应该只被应用到 public 方法上,这是由Spring AOP的本质决定的。
    系统设计:将标签放置在需要进行事务管理的方法上,而不是放在所有接口实现类上:只读的接口就不需要事务管理,由于配置了@Transactional就需要AOP拦截及事务的处理,可能影响系统性能。

@Transactional属性配置

image-20210907225124590

应用代码:

@Transactional
@Override
public void save() {
    User user = new User("admin");
    userMapper.insertSelective(user);
}

31、@ExceptionHandler

作用: Spring的@ExceptionHandler可以用来统一处理方法抛出的异常。@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常。(不常用)

应用代码:

@ExceptionHandler(NumberFormatException.class)
public String handleExeption(Exception ex) {
    System.out.println("抛异常了:" + ex);
    ex.printStackTrace();
    String resultStr = "异常:NumberFormatException";
    return resultStr;
}

以上就是开发中大多数能用到的注解,可能以后还会有,到时候在更新,由于整理的时间比较紧张,也有的借鉴的网上的资源,有什么不对的,欢迎交流。

下一篇: Lombok核心注解总结(二)

有什么问题欢迎和我交流。或者关注我的微信公众号码上言获得更多的学习。
微信公众号:码上言

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值