自己动手实现Java注解(Java Annotation in Action)

引子

写代码的每个同学估计都对注解(annotation)并不陌生,至少也用过@Override这样的注解。Java中的注解是个很神奇的东西,用了注解就可以少些很多代码,但是有没有想过这些注解呢如何实现的呢?这篇文章就带你走进Java注解的世界。本文的所有代码都在我的GitHub上的annokit里面,欢迎star和fork and pull request。

Java注解介绍

开始之前我们先来说一些基本的概念:

注解的介绍

Java注解是附加在代码中的一些元信息,用于编译和运行时进行解析和使用,起到说明、配置的功能。注解不会影响代码的实际逻辑,仅仅起到辅助性的作用。包含在java.lang.annotation包中。注解的定义类似于接口的定义,使用@interface来定义,定义一个方法即为注解类型定义了一个元素,方法的声明不允许有参数或throw语句,返回值类型被限定为原始数据类型、字符串String、Class、enums、注解类型,或前面这些的数组,方法可以有默认值。注解并不直接影响代码的语义,但是他可以被看做是程序的工具或者类库。它会反过来对正在运行的程序语义有所影响。注解可以从源文件、class文件或者在运行时通过反射机制多种方式被读取。

Java元注解

元注解是指注解的注解。包括 @Retention @Target @Document @Inherited四种。(java.lang.annotation中提供,为注释类型)。

注解 说明
@Target 定义注解的作用目标
@Retention 定义注解的保留策略。RetentionPolicy.SOURCE:注解仅存在于源码中,在class字节码文件中不包含;RetentionPolicy.CLASS:默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得;RetentionPolicy.RUNTIME:注解会在class字节码文件中存在,在运行时可以通过反射获取到。
@Document 说明该注解将被包含在javadoc中
@Inherited 说明子类可以继承父类中的该注解

Target类型说明

Target类型 说明
ElementType.TYPE 接口、类、枚举、注解
ElementType.FIELD 字段、枚举的常量
ElementType.METHOD 方法
ElementType.PARAMETER 方法参数
ElementType.CONSTRUCTOR 构造函数
ElementType.LOCAL_VARIABLE 局部变量
ElementType.ANNOTATION_TYPE 注解
ElementType.PACKAGE

Java注

  • 17
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,我可以为您设计一个简单的登录验证的SpringBoot项目,并使用Java注解来演示。以下是步骤: 1.创建SpringBoot项目 首先,我们需要创建一个新的SpringBoot项目。您可以使用Spring Initializr来创建项目,选择需要的依赖项,例如Spring Web和Spring Security。项目结构如下: ``` - src - main - java - com.example.demo - controller - LoginController.java - config - SecurityConfig.java - model - User.java - service - UserService.java - DemoApplication.java - resources - application.properties ``` 2.创建用户模型 我们需要创建一个用户模型,用于存储用户的登录信息,例如用户名和密码。在`model`包下创建一个`User`类: ```java package com.example.demo.model; public class User { private String username; private String password; public User() {} public User(String username, String password) { this.username = username; this.password = password; } // getters and setters } ``` 3.创建用户服务 我们需要创建一个用户服务,用于验证用户的登录信息。在`service`包下创建一个`UserService`接口和一个`UserServiceImpl`实现类: ```java package com.example.demo.service; import com.example.demo.model.User; public interface UserService { User findByUsername(String username); } ``` ```java package com.example.demo.service; import com.example.demo.model.User; import org.springframework.stereotype.Service; @Service public class UserServiceImpl implements UserService { @Override public User findByUsername(String username) { // 查询数据库或者其他存储介质,返回User对象 return new User("admin", "admin"); } } ``` 这里我们只是模拟了一个简单的用户查询,实际应用中需要根据实际情况来实现。 4.创建登录控制器 我们需要创建一个登录控制器,用于处理用户的登录请求。在`controller`包下创建一个`LoginController`类: ```java package com.example.demo.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class LoginController { @GetMapping("/login") public String login() { return "login"; } } ``` 这里我们使用`@Controller`注解来标记这是一个控制器类,使用`@GetMapping`注解来标记处理GET请求的方法。 5.创建登录页面 我们需要创建一个登录页面,用于接收用户的登录信息。在`resources/templates`目录下创建一个`login.html`页面: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>Login</h1> <form action="/login" method="post"> <div> <label for="username">Username:</label> <input type="text" id="username" name="username"> </div> <div> <label for="password">Password:</label> <input type="password" id="password" name="password"> </div> <button type="submit">Login</button> </form> </body> </html> ``` 6.配置Spring Security 最后,我们需要配置Spring Security来实现登录验证。在`config`包下创建一个`SecurityConfig`类: ```java package com.example.demo.config; import com.example.demo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserService userService; @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .formLogin().loginPage("/login").defaultSuccessUrl("/dashboard").permitAll() .and() .logout().logoutUrl("/logout").permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userService).passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } } ``` 这里我们使用了`@EnableWebSecurity`注解来启用Spring Security,使用`@EnableGlobalMethodSecurity(prePostEnabled = true)`注解来启用方法级别的安全性。 在`configure(HttpSecurity http)`方法中,我们配置了登录页面的访问权限、登录表单的提交地址、成功登录后的跳转页面,以及注销功能的配置。 在`configure(AuthenticationManagerBuilder auth)`方法中,我们配置了用户服务和密码加密方式。 在`passwordEncoder()`方法中,我们创建了一个`BCryptPasswordEncoder`对象,用于加密密码。 到此为止,我们已经完成了一个简单的登录验证的SpringBoot项目,并使用Java注解演示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值