JNDI知识摘要

#1 什么是JNDI? JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互 通过JNDI可以实现对象的创建与托管,和对象的使用过程完全解耦 比如:在application的底层创建对象,并将对象bind到特定的context中,对象的创建过程或者”查找”方式只有此底层模块支持,外部程序不可见.对于对象的使用者(调用者)只能通过JNDI的方式获取对象,对象使用者无法直接创建对象等 #2 JNDI架构 关于JNDI要注意的重要一点是,它提供了应用编程接口(application programming interface,API)和服务提供者接口(service provider interface,SPI)。这一点的真正含义是,要让应用与命名服务或目录服务交互,必须有这个服务的JNDI服务提供者,这正是JNDI SPI发挥作用的地方。服务提供者基本上是一组类,这些类为各种具体的命名和目录服务实现了JNDI接口—很像JDBC驱动为各种具体的数据库系统实现了JDBC接口一样。作为一个应用开发者,我们不必操心JNDI SPI的具体实现。只需要确认要使用的某一个命名或目录服务都有服务提供者。 JNDI提供了如下几个程序包: >Javax.naming:包含了访问命名服务的类和接口。例如,它定义了Context接口,这是命名服务执行查询的入口。 Javax.naming.directory:对命名包的扩充,提供了访问目录服务的类和接口。例如,它为属性增加了新的类,提供了表示目录上下文的DirContext接口,定义了检查和更新目录对象的属性的方法。 Javax.naming.event:提供了对访问命名和目录服务时的事件通知的支持。例如,定义了NamingEvent类,这个类用来表示命名/目录服务产生的事件,定义了侦听NamingEvents的NamingListener接口。 Javax.naming.ldap:这个包提供了对LDAP 版本3扩充的操作和控制的支持,通用包javax.naming.directory没有包含这些操作和控制。 Javax.naming.spi:这个包提供了一个方法,通过javax.naming和有关包动态增加对访问命名和目录服务的支持。这个包是为有兴趣创建服务提供者的开发者提供的。 #3 案例 引入依赖 <dependency> <groupId>com.sun.messaging.mq</groupId> <artifactId>fscontext</artifactId> <version>4.4</version> </dependency> <dependency> <groupId>com.sun.jndi</groupId> <artifactId>providerutil</artifactId> <version>1.2</version> <type>pom</type> </dependency> 文件操作实例 public static void main(String[] args) throws NamingException { Hashtable<String,String> env = new Hashtable<>(); //指明初始化的factory是我们下载的jar包中的RefFSContextFactory env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); //指明Context的初始URL,这里我们的是d盘 env.put(Context.PROVIDER_URL,"file:///d:/"); Context ctx = new InitialContext(env); //在C盘下创建要给文件夹 ctx.createSubcontext("testDir"); //在C盘下定位myFile文件 File f = (File) ctx.

技术图谱

《后端架构师技术图谱》 数据结构 队列 《java队列——queue详细分析》 非阻塞队列:ConcurrentLinkedQueue(无界线程安全),采用CAS机制(compareAndSwapObject原子操作)。 阻塞队列:ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)、DelayQueue、PriorityBlockingQueue,采用锁机制;使用 ReentrantLock 锁。 《LinkedList、ConcurrentLinkedQueue、LinkedBlockingQueue对比分析》 集合 《Java Set集合的详解》 链表、数组 《Java集合详解–什么是List》 字典、关联数组 《Java map 详解 - 用法、遍历、排序、常用API等》 栈 《java数据结构与算法之栈(Stack)设计与实现》 《Java Stack 类》 《java stack的详细实现分析》 Stack 是线程安全的。 内部使用数组保存数据,不够时翻倍。 树 二叉树 每个节点最多有两个叶子节点。 * 《二叉树》 完全二叉树 《完全二叉树》 叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。 平衡二叉树 左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 * 《浅谈数据结构-平衡二叉树》 * 《浅谈算法和数据结构: 八 平衡查找树之2-3树》 二叉查找树(BST) 二叉查找树(Binary Search Tree),也称有序二叉树(ordered binary tree),排序二叉树(sorted binary tree)。

设计模式之单例模式终极版【克隆-序列化-反射】

1 基本内容 1.1 概念 单例模式,是指在任何时候,该类只能被实例化一次,在任何时候,访问该类的对象,对象都是同一个。只要是程序员都会使用到,甚至都不能算是设计模式。但是在我们使用中也需要了解一下单例特性和使用场景 1.2 模式优缺点 单例模式有以下优点: >使用单例模式可以严格的控制用户怎样以及如何访问它 节约系统资源,提高系统的性能 单例模式有以下缺点: >不易扩展 单例类职责过重,在一定程度上违背了“单一职责原则” 如实例化对象长时间未使用,会GC回收,导致对象状态的丢失 # 2 单例模式分类 2.1 饿汉模式 public class SingletonEHan { private SingletonEHan() {} /** * 1.单例模式的饿汉式 */ private static SingletonEHan singletonEHan = new SingletonEHan(); public static SingletonEHan getInstance() { return singletonEHan; } // SingletonEHan instance= SingletonEHan.getInstance(); /** * 2. 单例模式的饿汉式变换写法 * 基本没区别 */ private static SingletonEHan singletonEHanTwo = null; static { singletonEHanTwo = new SingletonEHan(); } public static SingletonEHan getSingletonEHan() { if (singletonEHanTwo == null) { singletonEHanTwo = new SingletonEHan(); } return singletonEHanTwo; } // SingletonEHan instance= SingletonEHan.

Fail-Fast和Fail-Safe机制

1 Fail-Fast 1.1 fail-fast定义 fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件 例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件 1.2 Iterator与fast-fail机制 1.2.1 Iterator的好处 java源码中迭代器模式主要用于集合的迭代,只要实现了Collection接口就可以使用迭代器去遍历获取元素,这样我们不需要了解遍历的内部实现细节。 比如下面的 ArrayList 和 ImmutableList 遍历的例子: public class IteratorTest { public static List<Integer> list = Lists.newArrayList(1, 10, 11, 18, -1, 20, 99); public static ImmutableList<Integer> integerList = ImmutableList.copyOf(list); public static void main(String[] args) { Iterator<Integer> iterator1 = list.iterator(); while (iterator1.hasNext()) { System.out.println(iterator1.next()); } Iterator<Integer> iterator2 = integerList.iterator(); while (iterator2.hasNext()) { System.out.println(iterator2.next()); } } 我们去遍历的时候并不需要关心内部细节,但实际上ImmutableList是一个固定容量的list,不能进行 remove 和 add 方法的操作

实际项目运用之Adapter模式(适配器模式)

1. 模式简介 适配器模式解决的问题:让原本因为接口不兼容而不能一起工作的类可以一起工作 适配器模式中有三种角色: 目标接口Target:用户期望的类,可以是接口,也可以是抽象类或具体类; 需要适配的类Adaptee:当前系统中有的类; 适配器Adapter:在现有接口和目标接口之间的“适配者” 适配器模式的优点: 通过适配器模式,用户在做相似的操作时可以调用同一个接口,其内部过程对于用户是透明的,这样做更简单、更直接、更解耦; 复用了现存的类,解决了现存类和复用环境要求不一致的问题; 将目标接口和现有接口解耦,通过引入一个适配器类,而无需修改原有的代码。 适配器模式的缺点: 使用适配器模式后,如果想要改变适配对象,就需要更换适配器,而更换适配器是一个非常复杂的过程。 适配器模式的适用场景: > 当系统需要使用现有的类,而现有的类不符合系统的接口 当期望的功能和系统中现有的某个类的功能相似,但是具有不同的接口 当系统已经实现某功能,但用户想通过另种接口方式访问,而不想修改原有接口 当使用的第三方组件的接口和系统中定义好的接口不同,不希望修改系统接口 2.案例代码 适配器分类_适配器模式_和对象适配器模式 2.1 类适配器UML 2.2 对象适配器模式UML 2.3 案例代码: 被适配对象 public class Adaptee { public void adapteeMethod() { System.out.println("这是我们已经实现的功能!"); } } 对象适配器 public class Adapter implements Target { private Adaptee adaptee = new Adaptee(); @Override public void targetMethod() { adaptee.adapteeMethod(); } } 目标接口

设计模式之Template模式(模版模式)

1 模式简介 1.1 模版方法模式的定义: 模版方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。 1.2 结构 1.3 模式的组成 抽象类(AbstractClass): 定义抽象的原语操作(primitive operation) ,具体的子类将重定义它们以实现一个算法, 实现一个模板方法,定义一个算法的骨架。该模板方法不仅调用原语操作,也调用定义。 具体子类 (ConcreteClass): 实现原语操作以完成算法中与特定子类相关的步骤。 1.4 优缺点 模版方法模式的优点:  封装不变部分,扩展可变部分;  提取公共代码,便于维护;  行为由父类控制,子类实现。 模版方法模式的缺点:  每一个不同的实现都需要一个子类来实现,导致类个数增加,使系统更加庞大 模版方法模式的适用场景:  当类中有多个子类共有的方法  当有重要的、复杂的方法时,可以考虑作为模板方法 2 案例 抽象类 @FunctionalInterface public interface MyPredicate<T> { boolean test(T t); /** *过滤用户 */ default List<Employee> filterEmployee(List<Employee> emps, MyPredicate<Employee> mp) { List<Employee> list = new ArrayList<>(); for (Employee employee : emps) { if (mp.

synchronized实现原理及锁优化

1.引言 并发编程中synchronized是重量级锁,但随着JVM1.6对synchronized进行优化后,有些情况下它并不那么重,本文介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。 2.术语定义 CAS(Compare and Swap): 比较并交换。用于在硬件层面上提供原子性操作。在 Intel 处理器中,比较并交换通过指令cmpxchg实现。比较是否和给定的数值一致,如果一致则修改,不一致则不修改。 3.同步的基础 Java中的每一个对象都可以作为锁。 对于同步方法,锁是当前实例对象。 对于静态同步方法,锁是当前对象的Class对象。 对于同步方法块,锁是synchonized括号里配置的对象。 我们通过java代码和字节码分析下 java代码如下: public class SyncTest { private static double a = 1; public synchronized void plusNumber() { a++; } public void minusNumber() { System.out.println(a); synchronized (this) { a--; } } public synchronized static void divide() { a = a / 0.1; } } 解析成字节码指令: //同步方法 public synchronized void plusNumber(); descriptor: ()V flags: ACC_PUBLIC, ACC_SYNCHRONIZED Code: stack=4, locals=1, args_size=1 0: getstatic #2 // Field a:D 3: dconst_1 4: dadd 5: putstatic #2 // Field a:D 8: return LineNumberTable: line 12: 0 line 13: 8 //同步块 public void minusNumber(); descriptor: ()V flags: ACC_PUBLIC Code: stack=4, locals=3, args_size=1 0: getstatic #3 // Field java/lang/System.

JUC知识点总结

作为并发的基础,我们需要熟悉掌握JUC相关的知识,才能更好的在实际项目中运用, 下面是整理出来的juc思维导图: #系列文章 java内存模型之[JMM][重排序][happens-before] volatile关键字原理实现及应用 synchronized实现原理及锁优化 =============不定期更新============================

实际项目运用之Strategy模式(策略模式)

1. 策略模式概要 策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理。策略模式通常把一个系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。用一句话来说,就是:“准备一组算法,并将每一个算法封装起来,使得它们可以互换”。 下面就以一个示意性的实现讲解策略模式实例的结构。  这个模式涉及到三个角色:  ● 环境(Context)角色:持有一个Strategy的引用。  ● 抽象策略(Strategy)角色:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。  ● 具体策略(ConcreteStrategy)角色:包装了相关的算法或行为。 1.1 案例代码 策略模式上下文 public class Context { //持有一个具体策略的对象 private Strategy strategy; /** * 构造函数,传入一个具体策略对象 * @param strategy 具体策略对象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.algorithmInterface(); } } 抽象策略类 public interface Strategy { /** * 策略方法 */ public void algorithmInterface(); } 具体策略类 public class ConcreteStrategyA implements Strategy { @Override public void algorithmInterface() { //相关的业务 } } public class ConcreteStrategyB implements Strategy { @Override public void algorithmInterface() { //相关的业务 } } public class ConcreteStrategyC implements Strategy { @Override public void algorithmInterface() { //相关的业务 } } 客户端