JNDI注入
LDAP 轻量级目录访问协议
可以理解为是一种目录数据库,概念上类似于马云的中国黄页、城镇电话簿这种。
比较典型的应用场景:统一登录
例如:
一个公司下有很多系统比如OA、VPN之类巴拉巴拉的每个系统都有自己独立的账号,对于用户来说记起来会很麻烦,LDAP协议实现了统一这些接口,集中的存储了用户信息。
JNDI 命名服务(java命名和目录接口)
可以理解为是一个抽象的接口,通过jndi屏蔽了一些访问低层资源的细节
JDBC连接数据库的弊端
1、参数变动导致url得修改
2、数据库产品切换,驱动包修改
3、连接池参数的调整
JNDI:可以根据名字找到一个位置或者服务或者资源、对象
流程:
1、绑定发布一个服务 bind
2、查找服务 lookup
例如连接数据库
jdbc
String URL="jdbc:mysql://127.0.01:3306/xxx?useUnicode=true&characterEncoding=utf-8";
String USER="root";
String PASSWORD="123456";
在spring boot 用JNDI的方式
spring.datasource.jndi-name=jdbc/exampleDB //指定了JDBC的exampleDB数据库
定义方式如下
/conf/context.xml
<Context>
<Resource name="jdbc/exampleDB"
auth="Container"
type="Javax.sql.DataSource"
username="root"
password="123456"
driverClassName="com.mysql://localhost:3306/xxx"
maxTotal="8"
maxIdle="4"/>
</Context>
JNDI可以访问的服务:
DNS、XNam、Novell目录服务、LDAP、CORBA对象服务、文件系统、Windows XP/2000/NT/Me/9x的注册表、RMI、DSML v1&v2、NIS。
JNDI动态协议转换
当调用lookup()方法时,如果lookup方法的参数时一个uri地址,那么客户端就会去lookup()方法参数指定的uri中加载远程对象。
JNDI Naming Reference命名引用
当有客户端通过lookup(“refObj”)获取远程对象时,获取的是一个Reference的存根,由于是Reference的存根,所以客户端会先在本地的classpath中去检查是否存在类refClassName,如果不存在则去指定的url动态加载。
为了加载LDAP服务之外的远程对象,它可以去定义一个叫Reference引用的类,并且可以把在LDAP服务之外的这个Reference引用的类注册到LDAP的服务里面,如果通过LDAP服务访问到是一个Reference外部类的时候,是可以从这个远程的服务器去加载这个对象,比如是java编译后的class文件并且会对它进行实例化。
例如:
用lookup去找如下代码中的test资源
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Log4J {
private static final Logger logger = LogManager