首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

基于Spring Cloud 几行配置完成单点登录开发

单点登录概念 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。登录逻辑如上图 基于Spring 全家桶的实现 技术选型: Spring Boot Spring Cloud Spring Security oAuth2 客户端: maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency>

优秀的个人博客,低调大师

框架开发之Java注解的妙用和详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80550694 注解的好处: 1.能够读懂别人写的代码,特别是框架相关的代码。 2.本来可能需要很多配置文件,需要很多逻辑才能实现的内容,就可以使用一个或者多个注解来替代,这样就使得编程更加简洁,代码更加清晰。 3.(重点)刮目相看。(但是怎么样才能让别人刮目相看呢?会用注解不是目的,最重要的是要使用自定义注解来解决问题。)举个栗子:如果面试的时候,你跟老板说你会使用注解,老板觉得你这个人还行;但是如果老板发现你会自定义注解解决问题,老板肯定就会眼前一亮。 注解这一概念是在java1.5版本提出的,说Java提供了一种原程序中的元素关联任何信息和任何元数据的途径的方法。 一、Java中的常见注解 1)JDK注解JDK注解一共分为三类: JDK注解.png 案例:我们先新建一个接口people,如下: 1 2 3 4 5 public interface people { public String name(); public int age(); public void work(); } 然后再建一个类Child实现类people这个接口,并实现该类的方法: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class Child implements people { @Override public String name() { return null ; } @Override public int age() { return 0 ; } @Override public void work() { } 看到这里,我们发现这里的所有方法都会加上一个@Override标记,它告诉我们,同时也告诉编译器我们的这些方法肯定覆盖了类people里面的方法的。假如说,我现在把类people里面的某一个方法注释掉: 1 //public String name(); 再看类Child里面的name方法就会报错。这样,以后大家看到@Override的时候就能想到这个方法是覆盖了某个接口的方法的。 然后,我们回过头来看类people里面有一个work的方法。这里我们可以理解为人是要工作的,但是并不是所有的人都在工作,那么怎么办呢?如果说这个接口正在用,我们不能删除这个方法,这个时候我们就可以这样: 1 2 @Deprecated public void work(); @Deprecated标记就表明这个方法已经过时了,在实际中,它又有什么样的应用场景呢?我们在建一个测试类: 1 2 3 4 5 6 public class Test { public void work() { people people= new Child(); ! people.work(); } } 这个时候我们会发现myeclipse会给一个警告,并且在work中间出现一个破折号,意思就是这个方法已经过时了。那么问题来了,虽然这个方法过时了,但是我们就是那么傲娇,一定要用它,怎么办呢?只需要这样: 1 2 3 4 5 6 7 public class Test { @SuppressWarnings ( "deprecation" ) public void work() { people people= new Child(); people.work(); } } 这样我们就忽略了这个警告。@SuppressWarnings(“deprecation”)就表示我们忽略了deprecation这样的一个警告。 2)Java第三方注解 第三方注解.png 二、注解的分类 1)按照运行机制划分:【源码注解→编译时注解→运行时注解】 源码注解:只在源码中存在,编译成.class文件就不存在了。 编译时注解:在源码和.class文件中都存在。像前面的@Override、@Deprecated、@SuppressWarnings,他们都属于编译时注解。 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。像@Autowired自动注入的这样一种注解就属于运行时注解,它会在程序运行的时候把你的成员变量自动的注入进来。 2)按照来源划分:【来自JDK的注解——来自第三方的注解——自定义注解】 3)元注解:元注解是给注解进行注解,可以理解为注解的注解就是元注解。 三、自定义注解 我们分四步来解析自定义注解:自定义注解的语法要求: 1 2 3 4 5 6 7 8 9 @Target ({ElementType.METHOD,ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Description { String desc(); String author(); int age() default 18 ; } 首先我们要明确这不是一个接口,它是使用@interface关键字定义的一个注解。然后我们看下面的几个方法,String desc();虽然它很类似于接口里面的方法,其实它在注解里面只是一个成员变量(成员以无参无异常的方式声明),int age() default 18;(成员变量可以用default指定一个默认值的)。最后我们要知道:①.成员类型是受限制的,合法的类型包括基本的数据类型以及String,Class,Annotation,Enumeration等。②.如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)。③.注解类可以没有成员,没有成员的注解称为标识注解。 元注解: 有没有发现上面那段代码有一个没有说呢?没错,它们就是我们所说的元注解: 1 2 3 4 @Target ({ElementType.METHOD,ElementType.TYPE}) @Retention (RetentionPolicy.RUNTIME) @Inherited @Documented 我们先看第一行:@Target是这个注解的作用域,ElementType.METHOD是这个注解的作用域的列表,METHOD是方法声明,除此之外,还有:CONSTRUCTOR(构造方法声明),FIELD(字段声明),LOCAL VARIABLE(局部变量声明),METHOD(方法声明),PACKAGE(包声明),PARAMETER(参数声明),TYPE(类接口) 第二行:@Retention是它的生命周期,前面不是说注解按照运行机制有一个分类嘛,RUNTIME就是在运行时存在,可以通过反射读取。除此之外,还有:SOURCE(只在源码显示,编译时丢弃),CLASS(编译时记录到class中,运行时忽略),RUNTIME(运行时存在,可以通过反射读取) 第三行:@Inherited是一个标识性的元注解,它允许子注解继承它。 第四行:@Documented,生成javadoc时会包含注解。 使用自定义注解:使用注解的语法:@<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,…)案例: 1 2 3 4 @Description (desc= "i am Color" ,author= "boy" ,age= 18 ) public String Color() { return "red" ; } 这里的Description是我们刚才在自定义注解语法要求里面定义的注解噢,然后我们可以给它的每一个成员变量赋值,注意数据类型。值得注意的是,因为我们前面定义的作用域是在方法和类接口上,所以这个注解在Color()方法上使用是没问题的。 解析注解概念:通过反射获取类 、函数或成员上的运行时注解信息,从而实现动态控制程序运行的逻辑。 准备工作: Description类.png Child类.png 接下来,我们就开始测试了: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class ParseAnn { public static void main(String[] args) { try { // 使用类加载器加载类 Class c = Class.forName( "com.test.Child" ); // 找到类上面的注解 boolean isExist = c.isAnnotationPresent(Description. class ); // 上面的这个方法是用这个类来判断这个类是否存在Description这样的一个注解 if (isExist) { // 拿到注解实例,解析类上面的注解 Description d = (Description) c.getAnnotation(Description. class ); System.out.println(d.value()); } } catch (ClassNotFoundException e) { e.printStackTrace(); } } } 输出的结果:i am class annotation可以看到,我们成功的解析了Child类上面的注解。 接下来,我们继续解析方法上的注解: 1 2 3 4 5 6 7 8 9 10 //获取所有的方法 Method[] ms = c.getMethods(); // 遍历所有的方法 for (Method m : ms) { boolean isExist1 = m.isAnnotationPresent(Description. class ); if (isExist1) { Description d1=m.getAnnotation(Description. class ); System.out.println(d1.value()); } } 输出的结果:i am class annotationi am method annotation可以看到,我们成功的解析了方法上面的注解。 1 2 3 4 5 6 7 8 9 10 11 12 //另一种解析方法 for (Method m : ms) { //拿到方法上的所有的注解 Annotation[] as=m.getAnnotations(); for (Annotation a : as) { //用二元操作符判断a是否是Description的实例 if (a instanceof Description) { Description d=(Description) a; System.out.println(d.value()); } } } 也可以得到上面的效果。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册