1、定义类注解和方法注解 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface TypeAnnotation { String value() default "这是类注解"; } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface MethodAnnotation { String value() default "这是方法注解"; } 2、处理注解 此处通过反射拿到类对象,获取注解,来操作。 再生产中也可以结合切面编程来处理注解,或者扫描指定包下的所有类,遍历处理注解 public class AnnotationHandler { public static void main(String[] args){ //可以配置扫描路径加载所有class,也可以使用aspectj直接做前面处理 Class aClass .... 有更新! 自己定义一个注解 程序人生
基本流程示意图 spring boot security默认的登录流程如下所示,弄懂登陆的流程,有助于我们后面扩展框架,解决遇到的问题 UsernamePasswordAuthenticationFilter过滤器过滤请求 调用ProviderManager认证 获取了authenticationManager处理登录,AuthenticationManager接口有多个实现类,默认调用了ProviderManager providerManager中管理了多个认证适配器,调用对应的适配器进行认证 进入DaoAuthenticationProvider进行认证 DaoAuthenticationProvider继承了AbstractUserDetailsAuthenticationProvider类,这个类又实现了AuthenticationProvider接口,这个接口中的supports方法就是上文用来匹配适配器的方法,继承这个接口,实现这个方法,就可以自定义适配器 调用InMemoryUserDetailsManager查询用户信息 DaoAuthentication.... 有更新! spring security认证流程 程序人生
临界资源需要保持他的唯一性,再代码中,可以通过单例模式来实现(这里是典型的生产者/消费者问题) 构造方法中,用synchronized来做同步处理,为了避免每次进来都要给代码加锁影响性能,先在外层套if做判断 这里的connectionMap就是一个临界资源,代码初始化创建了8个数据库链接,放在map里面,然后多线程来获取调用这些connection 为了保证临界资源的安全,对获取链接和放回链接做了一个枷锁的处理,建立一个ReentrantLock锁,然后获取两个条件,获取连接的时候,判断是否有链接,有就继续,放回链接的时候,判断链接池是否已经满了,没满就放回 package cn.com.enersun.datahub.powerevent.consumer.database; import java.sql.Connection; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.concurrent.locks.Condition; impor.... 有更新! 多线程占用临界资源 程序人生
1.下载jdk https://www.oracle.com/cn/java/technologies/javase-downloads.html 下载的时候会提示登陆,此时开启浏览器调试直接拿到下载地址,在浏览器或迅雷中新建下载,可以不用登陆下载 2.上传到服务器解压 解压命令 tar -zxvf 压缩文件 3.配置环境变量 打开文件编辑 vi /etc/profile 输入配置信息 JAVA_HOME=/home/java/jdk1.8.0_261 CLASSPATH=$JAVA_HOME/lib/ PATH=$PATH:$JAVA_HOME/bin export PATH JAVA_HOME CLASSPATH JAVA_HOME就是jdk解压的位置 4.刷新配置 source /etc/profile 有更新! linux安装Java开发环境 程序人生
1.工厂模式 工厂模式根据传递的参数来决定生产的产品,增加产品需要改动工厂的的代码,在明确不同条件生产不同实例的情况下可以使用这个模式(一般这个模式可以应付大多数场景了) 代码 手机接口: public interface Phone { void phoneInfo(); } 华为手机 public class Huawei implements Phone { @Override public void phoneInfo() { System.out.println("我是华为手机"); } } 小米手机 public class Xiaomi implements Phone { @Override public void phoneInfo() { System.out.println("我是小米手机"); } } 生产工厂,在工厂中,根据不同的类型,生成不同的手机 public class PhoneFactory { public Phone createPhone(String type){ Phone product =null; switch (type){.... 有更新! 工厂模式 程序人生
1.maven引入依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.0.2</version> </dependency> 2.请求示例 package utils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.im.... 有更新! HttpClient的post请求设置请求体 程序人生