Spring生态是否实现SeContainerInitializer?能否整合Jakarta NoSQL Artemis?
Spring Boot整合Jakarta NoSQL Artemis的问题解答
1. Spring生态是否实现SeContainerInitializer/SeContainer?
Spring官方没有实现Jakarta EE规范中的SeContainerInitializer或SeContainer接口。Spring拥有独立的依赖注入体系,与Jakarta CDI属于平行的技术方案,官方暂无兼容Jakarta CDI核心接口的计划,且该现状预计会长期维持。
2. 能否在Spring Boot中使用Jakarta NoSQL Artemis?
可以使用,但需要手动整合CDI容器(如Weld)与Spring Boot,因为Artemis核心依赖Jakarta CDI进行Bean管理。以下是完整的简单示例:
步骤1:添加依赖(Maven)
<dependencies> <!-- Spring Boot核心依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <!-- Jakarta NoSQL Artemis图数据库核心 --> <dependency> <groupId>org.eclipse.jnosql.artemis</groupId> <artifactId>artemis-graph</artifactId> <version>1.0.0</version> </dependency> <!-- Neo4j驱动(示例采用Neo4j作为图数据库) --> <dependency> <groupId>org.eclipse.jnosql.diana</groupId> <artifactId>diana-neo4j</artifactId> <version>1.0.0</version> </dependency> <!-- Weld CDI容器实现 --> <dependency> <groupId>org.jboss.weld.se</groupId> <artifactId>weld-se-core</artifactId> <version>5.1.0.Final</version> </dependency> </dependencies>
步骤2:配置数据库连接(application.properties)
# Neo4j连接配置 jakarta.nosql.neo4j.uri=bolt://localhost:7687 jakarta.nosql.neo4j.user=neo4j jakarta.nosql.neo4j.password=your-db-password
步骤3:整合CDI与Spring的配置类
import jakarta.nosql.mapping.graph.GraphTemplate; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class JakartaNoSQLConfig { // 初始化Weld容器,扫描Artemis及自定义实体包 @Bean(destroyMethod = "shutdown") public WeldContainer weldContainer() { Weld weld = new Weld(); weld.addPackage(org.eclipse.jnosql.artemis.graph.GraphTemplate.class.getPackage()); weld.addPackage(com.example.demo.entity.Person.class.getPackage()); // 替换为你的实体包路径 return weld.initialize(); } // 将CDI管理的GraphTemplate注册为Spring Bean @Bean public GraphTemplate graphTemplate(WeldContainer weldContainer) { return weldContainer.select(GraphTemplate.class).get(); } }
步骤4:定义实体类
import jakarta.nosql.mapping.Column; import jakarta.nosql.mapping.Entity; import jakarta.nosql.mapping.Id; @Entity("Person") public class Person { @Id private String id; @Column("name") private String name; @Column("age") private int age; // 无参构造、全参构造、Getter/Setter public Person() {} public Person(String name, int age) { this.name = name; this.age = age; } // Getter和Setter省略 }
步骤5:业务服务实现
import jakarta.nosql.mapping.graph.GraphTemplate; import org.springframework.stereotype.Service; import java.util.Optional; @Service public class PersonService { private final GraphTemplate graphTemplate; // 注入Spring管理的GraphTemplate public PersonService(GraphTemplate graphTemplate) { this.graphTemplate = graphTemplate; } // 新增实体 public Person save(Person person) { return graphTemplate.insert(person); } // 根据ID查询 public Optional<Person> findById(String id) { return graphTemplate.find(Person.class, id); } }
步骤6:测试运行
import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class AppRunner implements CommandLineRunner { private final PersonService personService; public AppRunner(PersonService personService) { this.personService = personService; } @Override public void run(String... args) { // 新增数据 Person alice = new Person("Alice", 30); Person saved = personService.save(alice); System.out.println("已保存用户:" + saved.getName()); // 查询数据 personService.findById(saved.getId()).ifPresent(p -> System.out.println("查询到用户:" + p.getName()) ); } }
异常原因说明
你用@Inject注入GraphTemplate时Spring找不到Bean,核心原因是:
- Spring的依赖注入只会识别自身容器管理的Bean,而Artemis的核心Bean默认由CDI容器初始化;
- 必须通过上述配置,将CDI管理的Artemis Bean手动注册到Spring容器,才能被Spring的DI机制识别。
3. 现状与未来规划
- 当前Spring官方仍无实现Jakarta CDI核心接口的计划,Spring DI与Jakarta CDI将保持平行独立的状态;
- 这种现状并非临时情况,而是Spring生态的长期定位——专注于自身DI体系,不兼容Jakarta CDI的核心接口。
内容的提问来源于stack exchange,提问作者xinus01
相关产品推荐
相关产品推荐

