34、Java 企业开发:LDAP 与 EJB 技术全解析

Java 企业开发:LDAP 与 EJB 技术全解析

1. 轻量级目录访问协议(LDAP)

LDAP 服务器是专门的软件产品,它以层次树的形式存储目录条目,并且针对读取操作进行了高度优化。这使得它非常适合用于组织中的员工列表或电话目录等目录服务,因为这些目录主要是用于读取,而不是频繁更改,这正是 LDAP 服务器的优势所在。

从企业 Java 的角度来看,当需要快速查找某些 Java 对象时,如 JMS 连接工厂、队列或主题,就应该考虑使用 LDAP 解决方案。Java 开发人员使用 JNDI API 来查找和更新 LDAP 中的条目,就像 JDBC 之于数据库管理系统(DBMS)一样,JNDI 之于 LDAP 服务器。

以下是一些流行的 LDAP 服务器:
| 服务器名称 | 所属公司 | 开源情况 |
| ---- | ---- | ---- |
| Oracle Directory Server | Oracle | 否 |
| Microsoft Active Directory | Microsoft | 否 |
| OpenLDAP | 社区开发 | 是 |
| ApacheDS | Apache | 是 |
| OpenDS | Oracle | 是 |

LDAP 目录树有一个根条目,由一个或多个可分辨名称(唯一标识符)组成。通常,层次结构的顶部是一个以“o”(组织)为前缀的对象,下一级是以“ou”(组织单位)为前缀,“cn”表示通用名称,依此类推。与其他命名服务不同,搜索字符串从层次结构的最底层条目开始,根条目必须最后指定。例如,可用于搜索的可分辨名称如下:

cn=jsmith, ou=accounting, o=oracle.com

这个例子对应于 LDAP 树中的以下层次结构:

o = oracle.com
  ou = accounting
     cn = jsmith

以下代码片段展示了如何准备 JNDI 属性、连接到 LDAP 服务器并查找名为 CustomerHome 的对象:

Hashtable env = new Hashtable();        
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389");
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=Directory Manager");
env.put(Context.SECURITY_CREDENTIALS, "myPassword");

DirContext ctx = new InitialDirContext(env);
CustomerHome custHome = (CustomerHome) ctx.lookup("cn=CusomerHome, ou=RealBigProject, o=trump.com");

在实际的分布式应用中,可以有多种构建方式,例如:
1. 计算机 #1 运行 LDAP 服务器。
2. 计算机 #2 运行一个应用服务器,该服务器已将一些对象注册(发布)到计算机 #1 上的 LDAP 服务器。
3. 计算机 #3 有一个客户端程序,它在计算机 #1 上查找对象引用,并在计算机 #2 上调用这些对象的方法。
4. 计算机 #4 有一个数据库管理系统,供计算机 #2 上运行的应用服务器使用。
5. 计算机 #5 发布金融市场数据,计算机 #2 订阅此服务。

graph LR
    A[计算机 #1: LDAP 服务器] --> B[计算机 #2: 应用服务器]
    B --> C[计算机 #3: 客户端程序]
    B --> D[计算机 #4: 数据库管理系统]
    E[计算机 #5: 金融数据发布] --> B
2. 实践:创建消息接收器

可以创建一个名为 MessageReceiver 的类来消费消息。它需要执行 JNDI 查找并开始监听 TestQueue 。当消息到达时, MessageReceiver 应显示该消息。向特定 Servlet 发出请求时,应向队列发送消息, MessageReceiver 接收并打印其内容。

具体步骤如下:
1. 创建一个新类 MessageReceiver ,实现 MessageListener 接口,代码类似于之前的示例,但这次要执行对 MyTestConnectionFactory 和 MyJMSTestQueue 的 JNDI 查找。
2. 了解如何配置 GlassFish 启动类,并实现该类,以便在服务器启动时实例化 MessageReceiver 。
3. 使用特定的 Servlet 测试发送/接收周期。

3. 企业 JavaBeans(EJB)简介

EJB 是 Java EE 技术之一,可用于在分布式应用中实现业务层。随着 Java EE 6 的发布,EJB 3.1 和 Java 持久化 API(JPA)2.0 为实现业务逻辑和数据持久化提供了简洁的解决方案。支持 EJB 3.1 的应用服务器包括 GlassFish v3、JBoss 6 和 WebSphere 8 等。

为什么需要 EJB 容器呢?虽然可以在普通 Java 对象(POJO)中实现业务逻辑,但可能需要手动编写多线程环境,并且应用可能需要事务支持。例如,如果业务逻辑分布在 POJO 1 和 POJO 2 中,当第二个 POJO 失败时,需要回滚第一个 POJO 已完成的操作。此外,使用 JMS 编写消息接收器时,要实现可扩展性也比较困难。

EJB 容器可以解决这些基础设施相关的问题,无需手动编程。可以简单地配置消息驱动 bean(MDB)池以实现多个消息监听器,根据需要开启事务支持,并且无需担心多线程问题。配置过程只需在 EJB 类中添加 Java 注解,而 bean 之间的通信可以通过依赖注入或单例 bean 实现。

EJB 容器还提供了异步方法调用功能,无需 JMS 或 MOM 即可实现异步处理。此外,EJB 3.1 支持嵌入式容器,可以在 Java SE 环境中运行 EJB 应用,方便进行测试。创建嵌入式容器只需一行代码:

EJBContainer myContainer = EJBContainer.createEJBContainer();
4. EJB 的类型

EJB 主要有两种类型:会话 bean 和消息驱动 bean。消息驱动 bean 专门用于从 JMS 队列或主题中检索消息,而会话 bean 则包含应用的业务逻辑。会话 bean 又分为三种类型:
- 无状态会话 bean :包含业务逻辑,但不支持状态,即不会“记住”特定于客户端的任何数据。例如,同一个客户端连续调用无状态 bean FindBooks 的两个方法时,容器可能会使用 FindBooks bean 的两个不同实例。
- 有状态会话 bean :包含业务逻辑和状态。EJB 容器会为客户端分配一个特定的会话 bean 实例,并可以在后续方法调用之间存储结果。例如,可以使用有状态 bean 实现购物车功能。
- 单例会话 bean :在容器中保证只有一个实例。可以将其视为全局存储库,一个 bean 可以将数据放入其中供另一个 bean 使用,并且可以确保并发访问时没有竞争条件。

早期的 EJB 规范定义了用于数据持久化的实体 bean,但在 EJB 3.1 规范中,它们正在被逐步淘汰,很可能会在未来的 Java EE 版本中消失。

5. 无状态会话 bean

下面通过一个简单的示例介绍无状态会话 bean,该 EJB 包含返回消息“Hello World”的业务逻辑。

Bean 代码示例 :

@Stateless
public class HelloWorldBean {
    public String sayHello() {
        return "Hello World!";
    }
}

基本上,只需创建一个 POJO 并使用一个或多个 Java 注解进行标注,无需实现特殊接口即可将 POJO 转换为 EJB。还可以使用可选的配置文件 ejb-jar.xml 来指定 EJB 的元数据。

客户端视角 :
该 bean 在服务器上运行,调用 sayHello() 方法的客户端可以在同一个 JVM 中(如 Servlet 或另一个 bean)运行,也可以在另一个 JVM 中(如独立的 Java SE 应用程序或部署在另一个容器中的 Java EE 类)运行。

如果 HelloWorldBean 仅由在同一 JVM 中运行的客户端使用,可以使用 @LocalBean 注解将其标记为无接口 bean。如果要向本地客户端公开某些业务方法,可以创建一个标记为 @Local 的接口,让 bean 类实现该接口;如果要向远程客户端公开 bean,则创建一个标记为 @Remote 的接口并让 bean 实现它。

本地无接口 bean 示例 :

import javax.ejb.LocalBean;
import javax.ejb.Stateless;

@LocalBean
@Stateless
public class HelloWorldBean {
    public String sayHello() {
        return "Hello World!";
    }
}

具体操作步骤如下:
1. 在 Eclipse 中创建一个新的动态 Web 项目,命名为 Lesson32 。
2. 在 com.practicaljava.lesson32.client 包中创建一个新的 Servlet 类 HelloWorldServlet ,该 Servlet 将作为客户端与 EJB 通信。
3. 在 com.practicaljava.lesson32.ejb 包中创建一个 Java 类 HelloWorldBean ,选择“File -> New -> Other -> EJB -> Session Bean (EJB 3.x)”,不选择任何本地或远程业务接口,并取消选中与 EJB 2.x 相关的对象。添加 sayHello() 方法,完成 EJB 的创建。
4. 使用 @EJB 注解将 HelloWorldBean 注入到 Servlet 代码中:

@EJB HelloWorldBean myBean;

如果 Eclipse 标记该行有错误,右键单击并选择“Quick Fix”,自动插入两个导入语句。也可以使用 JNDI 查找来替代注解注入:

Context ctx = new InitialContext();
HelloWorldBean myBean = (HelloWorldBean) ctx.lookup("java:global/Lesson32/HelloWorldBean");
  1. 在 Servlet 的 doGet() 方法中添加以下两行代码,调用 EJB 的 sayHello() 方法:
PrintWriter out = response.getWriter();
out.println(myBean.sayHello()); 

完整的 Servlet 代码示例 :

import java.io.IOException;
import java.io.PrintWriter;
import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.practicaljava.lesson32.ejb.HelloWorldBean;

@WebServlet("/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {

  @EJB HelloWorldBean myBean;
  protected void doGet(HttpServletRequest request, 
        HttpServletResponse response) throws ServletException, IOException {
       PrintWriter out = response.getWriter();
       out.println(myBean.sayHello());       
  }
}
6. 异步方法

无状态 bean 还有一个重要特性是异步方法。假设 sayHello() 是一个执行长时间计算的方法,希望在调用该方法后继续执行其他操作,而不必等待其完成。在 EJB 容器中,不需要在应用代码中创建和启动线程,因为 EJB 容器会处理所有多线程问题。可以使用 @Asynchronous 注解标记方法,并让其返回 javax.ejb.AsyncResult 对象:

@Asynchronous 
public <Future>String sayHello() {
    // 一些长时间的计算代码
    //... 
    return new AsyncResult<String>("Hello World!");
}

客户端调用 sayHello() 方法后,可以继续执行其他代码,在需要结果时进行阻塞调用 get() :

// 异步调用
Future<String> myFutureGreeting = myBean.sayHello();
// 其他代码
//...
// 稍后进行阻塞调用,等待结果
String myGreeting = myFutureGreeting.get();

如果客户端需要在 EJB 上启动多个方法并行运行,这些方法甚至不需要返回值,只需将方法声明为异步并从客户端调用即可。

7. 有状态会话 bean

与无状态会话 bean 不同,有状态会话 bean 会为客户端分配更长时间,并且会记住之前方法执行的结果。例如,可以使用有状态 bean 实现购物车功能,用户在浏览公司目录时可以向购物车中添加多个商品。当客户端结束会话时,有状态 bean 可以分配给另一个客户端。

假设存在一个有状态 EJB MyShoppingCart ,客户端使用 JNDI 查找该 bean 并调用 addItem() 方法添加商品,继续浏览后添加另一个商品,最后调用 placeOrder() 方法结账。所有这些方法调用都在同一个 MyShoppingCart 实例上进行。

MyShoppingCart myCart = (MyShoppingCart) ctx.lookup("java:global/OnlineStore/MyShoppingCart");
// 客户端浏览目录,找到第一个要购买的商品
...
myCart.addItem(myFirstItem);
// 客户端继续浏览目录,找到第二个要购买的商品
...

综上所述,LDAP 和 EJB 是 Java 企业开发中非常重要的技术,它们分别在目录服务和业务逻辑实现方面发挥着关键作用。通过合理使用这些技术,可以构建出高效、可扩展的分布式应用。

Java 企业开发:LDAP 与 EJB 技术全解析

8. 本地与远程 Bean 的区别与应用

在 EJB 开发中,本地 Bean 和远程 Bean 有着不同的应用场景和实现方式。

8.1 本地 Bean

本地 Bean 主要用于在同一 JVM 内的组件之间进行交互。为了向本地客户端暴露业务方法,需要声明一个标记为 @Local 的接口,并让 Bean 类实现该接口。以下是一个示例:

@Local
public interface Greeting {
    public String sayHello();
}

@Stateless
public class HelloWorldBeanL implements Greeting {
    public String sayHello() {
        return "Hello World!";
    }    
}

在这个示例中, Greeting 接口被标记为 @Local , HelloWorldBeanL 类实现了该接口。这样,在同一 JVM 内的其他组件就可以通过该接口调用 HelloWorldBeanL 的业务方法。

8.2 远程 Bean

远程 Bean 则用于不同 JVM 之间的交互。对于可能远程访问 Bean 的客户端,需要声明一个标记为 @Remote 的接口,并让 Bean 类实现该接口。示例如下:

@Remote
public interface Greeting {
    public String sayHello();
}

@Stateless
public class HelloWorldBeanL implements Greeting {
    public String sayHello() {
        return "Hello World!";
    }    
}

客户端通过 JNDI 查找来定位远程 Bean。由于客户端和服务器可能运行在不同的 JVM 中,远程方法的所有参数必须是可序列化的。

下面是本地 Bean 和远程 Bean 的对比表格:
| 类型 | 应用场景 | 接口标记 | 调用方式 | 参数要求 |
| ---- | ---- | ---- | ---- | ---- |
| 本地 Bean | 同一 JVM 内组件交互 | @Local | 直接调用 | 无特殊要求 |
| 远程 Bean | 不同 JVM 间交互 | @Remote | JNDI 查找 | 所有参数必须可序列化 |

9. EJB 部署与测试

在开发完 EJB 后,需要将其部署到服务器上进行测试。以 GlassFish 服务器为例,具体步骤如下:
1. 部署项目 :在 Servers 视图中右键单击 GlassFish 服务器,将项目 Lesson32 添加到服务器以部署该 Web 应用。
2. 开启自动部署 :为了避免每次代码更改都手动重新部署应用,可以开启自动部署功能。双击 Servers 视图中的 GlassFish 服务器,将 Publishing 首选项更改为“Automatically publish when resources change”。

graph LR
    A[选择 GlassFish 服务器] --> B[添加项目 Lesson32]
    B --> C[双击服务器]
    C --> D[更改 Publishing 首选项]
    D --> E[自动发布资源更改]
  1. 启动服务器并测试 :启动 GlassFish 服务器(如果未运行),运行 HelloWorldServlet 。可以在浏览器中输入 http://localhost:8080/Lesson32/HelloWorldServlet 查看 EJB 产生的输出。
10. EJB 容器的优势总结

EJB 容器在 Java 企业开发中具有诸多优势,具体如下:
- 基础设施管理 :EJB 容器负责处理多线程、事务支持、消息监听池配置等基础设施相关的问题,开发者无需手动编程,减少了开发工作量和出错的可能性。
- 可扩展性 :通过配置消息驱动 Bean 池和提供集群与故障转移支持,EJB 容器能够轻松应对分布式应用的扩展需求。
- 安全性 :安全授权由 EJB 容器负责,确保了应用的安全性。
- 异步处理 :支持异步方法调用,无需额外的 JMS 或 MOM 即可实现异步处理,提高了应用的性能和响应速度。
- 嵌入式容器 :EJB 3.1 支持嵌入式容器,可在 Java SE 环境中运行 EJB 应用,方便进行测试。

11. 总结与实践建议

在 Java 企业开发中,LDAP 和 EJB 技术是构建高效、可扩展分布式应用的重要工具。LDAP 服务器适用于存储和快速查找目录信息,如员工列表、电话目录等;而 EJB 则用于实现分布式应用的业务逻辑,通过 EJB 容器可以解决多线程、事务管理、消息处理等复杂问题。

为了更好地应用这些技术,建议开发者:
1. 深入学习 JNDI :掌握 JNDI 的使用方法,它是连接 LDAP 服务器和 EJB 客户端的桥梁。
2. 合理选择 EJB 类型 :根据业务需求选择合适的 EJB 类型,如无状态会话 Bean 适用于多用户并发请求的场景,有状态会话 Bean 适用于需要保存客户端状态的场景。
3. 利用 EJB 容器特性 :充分利用 EJB 容器提供的基础设施管理、可扩展性、安全性等特性,减少开发工作量,提高应用的质量和性能。
4. 多进行实践 :通过实际项目的开发,加深对 LDAP 和 EJB 技术的理解和掌握。

总之,通过合理运用 LDAP 和 EJB 技术,开发者可以构建出更加高效、稳定、安全的 Java 企业应用。

相关推荐

2007-2025年36家商业银行绿色信贷余额数据(2025年无缺失)

1、指标覆盖区间为2007年至2025年 2、数据取自各银行年度报告及社会责任报告 3、核心指标为绿色信贷余额 4、涉及银行包括:苏农银行、中国银行、紫金银行、杭州银行、华夏银行、邮储银行、青岛银行、兴业银行、苏州银行、农业银行、宁波银行、上海银行、江阴银行、招商银行、长沙银行、北京银行、无锡银行、民生银行、浙商银行、常熟银行、成都银行、工商银行、郑州银行、光大银行、南京银行、建设银行、浦发银行、贵阳银行、渝农商行、西安银行、交通银行、江苏银行、中信银行、张家港行、平安银行、青农商行

2019-2026年 中国分行业进出口数据 xlsx

数据整理中国各细分行业海关进出口数据,包括中国对各个国家进口、出口数据,中国各个行业进出口数据,各国贸易数据是了解每个国家市场的最基础和重要信息。数据非面板数据,时间、行业分类有缺失。 标 日期 采购商国家/地区 供应商国家/地区 采购商 供应商 采购商地址 供应商地址 通知人 通知人地址 制造商 原产国 目的国 起运港 目的港 HS编码 产品描述 唛头 数量 数量单位 重量 金额($) 单号 集装箱号 品牌

2000-2024年 各地区结婚、离婚、再婚等数据-各地区 xlsx

一般来说,经济发达地区的结婚和离婚率相对较高,而经济欠发达地区的结婚和离婚率相对较低。此外,不同省份的文化、习俗、社会观念等因素也会对结婚和离婚情况产生影响。 本数据从2000年至2024年,对各地区的结婚、离婚及再婚情况进行了全面统计。通过对这些数据的深入分析,我们可以洞察婚姻趋势的演变轨迹,以及地区之间的差异性。这些数据不仅反映了人们的婚姻选择、家庭形态的变化,还揭示了社会动态的演变。对于研究家庭结构和社会变迁的学者而言,这份数据提供了宝贵的参考依据和信息。 相关数据 年份 地区 行政区划代码 所属地域 年末常住人口(万人) 人口出生率(‰) 人口死亡率(‰) 15岁及以上人口数(人口抽样调查)(人) 15岁及以上男性人口数(人口抽样调查)(人) 15岁及以上女性人口数(人口抽样调查)(人) 15岁及以上未婚人口数(人口抽样调查)(人) 15岁及以上男性未婚人口数(人口抽样调查)(人) 15岁及以上女性未婚人口数(人口抽样调查)(人) 15岁及以上初婚有配偶人口数(人口抽样调查)(人) 15岁及以上男性初婚有配偶人口数(人口抽样调查)(人) 15岁及以上女性初婚有配偶人口数(人口抽样调查)(人) 15岁及以上再婚有配偶人口数(人口抽样调查)(人) 15岁及以上男性再婚有配偶人口数(人口抽样调查)(人) 15岁及以上女性再婚有配偶人口数(人口抽样调查)(人) 15岁及以上离婚人口数(人口抽样调查)(人) 15岁及以上男性离婚人口数(人口抽样调查)(人) 15岁及以上女性离婚人口数(人口抽样调查)(人) 15岁及以上丧偶人口数(人口抽样调查)(人) 15岁及以上男性丧偶人口数(人口抽样调查)(人) 15岁及以上女性丧偶人口数(人口抽样调查)(人) 15岁及以上有配偶人口数(人口抽样调查)(人) 15岁及以上男性有配偶人口数(人口抽样调查)(人) 15岁及以上女性有配偶人口数(人口抽样调查)(人) 结婚登记(万对) 内地居民登记结婚(万对) 内地居民初婚登记(万人) 内地居民再婚登记(万人) 涉外及港澳台居民登记结婚(万对) 离婚登记(万对) 粗离婚率(‰)

后端开发 Docker4.99.0 AppleSilicon 苹果芯片 Mac 安装包

本资源为 Docker Desktop 4.99.0 苹果芯片(Apple Silicon)专用安装包,原生适配 M 系列 Mac,可快速搭建本地容器开发环境,支持镜像拉取、容器编排、项目打包部署。适合后端开发、运维、全栈开发者,用于本地微服务、测试环境、项目容器化开发。

milvus-v2.6.25镜像文件

milvus-v2.6.25镜像文件

医学信息影像AI临床采纳的责任边界研究:基于场景选点与流程嵌入的分步实施路径

内容概要:本文以“影像人工智能(CAD)的临床采纳与责任边界”为核心议题,指出当前影像AI的发展瓶颈已从技术准确性转向“谁负责、怎么用”的机制与治理问题。通过文献研究与政策文本分析,文章系统梳理了CAD的应用场景与效果、临床采纳障碍及责任边界划分三大问题,揭示出“假阳性导致医生信任下降、责任归属不清、采购与使用脱节”三重瓶颈相互强化的闭环结构,并提出“场景选点—试用验证—责任规则先行—流程嵌入”的分步递进式建设路径,强调需通过机制闭环实现技术真正落地。; 适合人群:从事医疗信息化管理、医学人工智能研究、医院运营管理及相关政策制定的专业人员,以及医学信息学、卫生管理专业的高年级本科生与研究生。; 使用场景及目标:①用于医疗机构评估影像AI引入的可行性与实施路径,避免资源错配;②为政策制定者提供优化考核机制与责任界定的理论依据;③帮助AI厂商理解临床真实需求,提升产品与流程的契合度;④作为学术研究框架,支持对技术采纳与治理机制的深入探讨。; 阅读建议:本文构建了“现状—机制—治理”三层分析框架,建议读者结合自身角色聚焦不同章节:管理者重点关注第五章路径设计,研究者关注第三章文献述评与第六章研究展望,实施者关注第四章瓶颈分析与实施保障。阅读时应特别注意概念的操作化定义与证据等级区分,避免将理论推导误作实证结论,并在应用时结合本地实际进行裁剪与验证。

推动企业技术需求与高校科研成果对接,需要哪些关键支撑要素?.docx

推动企业技术需求与高校科研成果对接,需要哪些关键支撑要素?

科技中介服务机构如何高效开展技术需求挖掘与分析?.docx

科技中介服务机构如何高效开展技术需求挖掘与分析?

A股分钟行情数据,涵盖股票、ETF、可转债及指数 每条记录包含交易日期、具体时间、证券代码、证券简称、开盘价、最高价、最低价、收盘价、成交量、成交额 数据为日内分钟频率,逐分钟记录价格变动与成交信息

A股分钟行情数据,涵盖股票、ETF、可转债及指数。每条记录包含交易日期、具体时间、证券代码、证券简称、开盘价、最高价、最低价、收盘价、成交量、成交额。数据为日内分钟频率,逐分钟记录价格变动与成交信息,按交易日分割存储,历史分钟K线保留完整。 数据源:CMES金融数据库

一个免费的激光打标软件的配套硬件说明

激光打标软件配套硬件说明

高校技术转移办公室人员如何利用知识图谱技术提升科技成果评价的科学性与高效性?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人在推动内部技术转化时,如何确保服务流程的合规与可控?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企在推动创新成果转化时,如何保障技术交易流程的合规性与可追溯性?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

基于STM32的INA226电压电流检测仪

该功率检测装置以STM32F103C8T6微控制器为核心,集成功率检测、数据交互、状态显示和用户提示功能,通过模块化设计实现稳定运行。系统包括按键、LED指示灯、OLED屏幕、INA226电压电流检测、复位电路、晶振电路、蜂鸣器驱动、输入输出接口、调试接口和3.3V降压电路等模块。微控制器通过按键检测用户输入,启动功率检测,采集数据并通过OLED显示,异常情况触发蜂鸣器报警,LED状态指示同步反馈。3.3V降压电路为所有模块提供稳定电源,晶振电路确保时序精度。INA226芯片通过I2C接口与微控制器通信,实

a2784288164的博客 1910

让 PyCharm 代码“发光”:高亮插件与特效全攻略

PyCharm 作为一款强大的 Python IDE,支持多种插件让代码“发光”——无论是动态输入特效、彩虹括号,还是霓虹主题,都能让你的代码脱颖而出!进入 File → Settings → Editor → Color Scheme → Rainbow Brackets。进入 File → Settings → Appearance & Behavior → Material Theme。进入 File → Settings → Editor → Color Scheme → General。

qq_43580271的博客 3835

链接文件及功能安全:Hightec如何将Flash驱动放进RAM

Fls本身是无法操作自身的,犯冲突。Fls_WriteCmdCycles (预留300字节)与 Fls_EraseCmdCycles(预留200字节) 函数在执行之前将会Copy进RAM,Fls本身是不能操作Fls本身的,除非把最底层的驱动函数防止在RAM或者其他的Flash里面,假设Flash放置在PF0可以操作PF1。英飞凌的驱动有个规定写指令预留300字节,擦除指令预留200字节。

梦想技术家 2142

基于PyTorch+Transformer实现谣言检测系统

本项目使用基于`PyTorch+Transformer`的谣言检测模型,将文本中的谣言事件进行连续向量化,通过一维卷积神经网络的学习训练来挖掘表示文本深层的特征,避免了特征构建的问题,并能发现那些不容易被人发现的特征,从而产生更好的效果。

优快云 精品推荐 6349

uniapp ios原生插件开发 (framework,cocoapods)

已知UniApp的插件开发方式有两种, 第一种 Xcode Framework的方式,这种方式是官方指定的方式。 这种方式的优点就是简单直接, 但也有不足,比如当插件需要引入一些三方库时,操作起来就不是那么方便。 而使用Cocoapods则可以很方便的引入三方库。 接下来,本文探索使用Cocoapods的方式来进行UniApp插件开发。

Rey的技术博客 9823

uniapp:实现圆盘/色盘取色器组件,圆环颜色选择器用户可拖拽选择颜色值实时更新用户选择的颜色数据,拖动丝滑流畅不卡顿(uniapp小程序/手机h5网页/安卓苹果app/nvue都能使用,详细源码)

uniapp项目中使用颜色选择器,uniapp实现简单圆形色盘、取色器、拾色器组件,Uniapp自定义颜色选择器取色器,圆形的颜色选择器,uniapp颜色拾取器,拾色器 取色器 颜色选择器,uniapp vue3圆形的色盘取色,uni-app如何封装一个取色器组件,用uniapp写调色板,uniapp颜色选择器插件,实现圆环颜色选择器,Uni-app在App端使用颜色选择器,uniapp微信小程序圆盘颜色选择,uniapp H5网页实现圆形的取色器,使用canvas实现的简单圆形色盘,可自定义相关大小,un

✅ 精选推荐文章 4534

使用lighttpd和开发板进行交互

本文介绍了如何在嵌入式开发板上使用Lighttpd Web服务器实现硬件交互功能。主要内容包括:Lighttpd通过CGI程序间接控制硬件的基本原理;lighttpd.conf配置文件的详细解析;开发板文件目录结构设计;用C语言编写控制GPIO的CGI程序示例;网页调用CGI实现按钮触发控制的HTML代码;常见问题调试建议。最后通过效果图展示了网页按钮点击后成功控制LED灯的实际效果,验证了Lighttpd+CGI方案在嵌入式设备Web控制中的可行性。

m0_49476241的博客 1424

华为OD机考双机位A卷 - 开心消消乐(Java & Python& JS & C/C++ & GO )

华为OD机考双机位A卷 - 开心消消乐(OD上机考试双机位A卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。

算法大师! 1268

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 1、AWS 云系统管理入门指南
下一篇: 29、单向函数的比特安全性与伪随机数生成
废话输出机427
博客等级 码龄4年 414粉丝 1552原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值