前言
在微服务架构日益普及的今天,跨项目共享 Bean 类的能力变得尤为重要。本文将详细介绍如何在 Spring Boot 项目中实现跨项目获取 Bean 类的方法,以便在多个项目之间共享功能和服务。
@Enable
获取 其他项目 的 bean 类
创建 两个 项目
在 需要导入其他项目的pom 里面 导入 文件
<!-- 导入其他 模块--> <dependency> <groupId>com.example</groupId> <artifactId>springboot-demo-02</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
在被 导入的项目里面 创建 好bean 类
再创建 config
package com.example.pojo; public class Student { private int id; private String name; private String password; }
package com.example.pojo.config; import com.example.pojo.Student; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; @Configuration public class StudentConfig { @Bean // 条件 public Student student(){ return new Student(); } }
通过不同的方式得到bean
package com.example.springbootdemo01; import com.example.pojo.config.EnableStudent; import com.example.pojo.config.StudentConfig; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Import; /* *1. @ComponentScan 当前 引导类 所在包 及其 子包 com.example.pojo.config *2. 使用 @Import 加载类,这些类 都会 被 spring 创建 并放入 Ico 容器 *3. 可以对 @Import 进行 封装 在 studentConfig 同 目录下 创建 注解 把 东西都导入在里面 * */ @SpringBootApplication //@ComponentScan("com.example.pojo.config") //@Import(StudentConfig.class) @EnableStudent public class SpringbootDemo01Application { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SpringbootDemo01Application.class, args); Object user = context.getBean("student"); System.out.println(user); } }
主要 封装一个 注解 @EnableStudent
package com.example.pojo.config; import org.springframework.context.annotation.Import; import java.lang.annotation.*; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(StudentConfig.class) public @interface EnableStudent { }
@import
/* * Import 的 4 种 用法 * 1. 导入 bean * 2.导入配置类 * 3. 导入 ImportSelector的实现类 * 4. 导入ImportBeanDefinitionRegistrar 实现类 * */ //@Import(Student.class) //@Import(StudentConfig.class) //@Import(MyImportSelector.class) @Import({MyImportBeanDefinitionRegistrar.class})
简单使用 直接 导入 类
配置类也一样
3
importSelector,通过继承 来放入包名来 导入
package com.example.pojo.config; import org.springframework.context.annotation.ImportSelector; import org.springframework.core.type.AnnotationMetadata; public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.example.pojo.Student","com.example.pojo.Role"}; } }
4
package com.example.pojo.config; import com.example.pojo.Student; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; import org.springframework.core.type.AnnotationMetadata; public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry){ AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Student.class).getBeanDefinition(); registry.registerBeanDefinition("student",beanDefinition); } }
事件监听
springboot 的 监听器
这两个可以直接执行,程序启动之后执行这两个方法
package com.example.springbootdemo01.listener; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @Component public class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("MyApplicationRunner ..."); } }
package com.example.springbootdemo01.listener; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("command start..."); } }
listenter
配置 spring.factories
# 这个 包会被 自动 扫描 这个 包的全名 = 自己定义的类实现 名 的全路径 org.springframework.context.ApplicationContextInitializer=com.example.springbootdemo01.listener.MyApplicationContextInitializer
实现类
package com.example.springbootdemo01.listener; import org.springframework.context.ApplicationContextInitializer; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; // 检查一些 资源 是否 存在 // 在banner @Component public class MyApplicationContextInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("init start..."); } }
另一个也是一样
org.springframework.boot.SpringApplicationRunListener=com.example.springbootdemo01.listener.MySpringApplicationRunListener
package com.example.springbootdemo01.listener; import org.springframework.boot.ConfigurableBootstrapContext; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplicationRunListener; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.stereotype.Component; import java.time.Duration; // 检查 硬件 // 所有 的生命周期 public class MySpringApplicationRunListener implements SpringApplicationRunListener { // 如果哟报错需要加这个 public MySpringApplicationRunListener(SpringApplication application ,String [] args) { } // alt + ins 实现 方法 // 启动的 时候 实现不同的 方法 @Override public void starting(ConfigurableBootstrapContext bootstrapContext) { SpringApplicationRunListener.super.starting(bootstrapContext); System.out.println("application start listening"); } @Override public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) { SpringApplicationRunListener.super.environmentPrepared(bootstrapContext, environment); } @Override public void contextPrepared(ConfigurableApplicationContext context) { SpringApplicationRunListener.super.contextPrepared(context); } @Override public void contextLoaded(ConfigurableApplicationContext context) { SpringApplicationRunListener.super.contextLoaded(context); } @Override public void started(ConfigurableApplicationContext context, Duration timeTaken) { SpringApplicationRunListener.super.started(context, timeTaken); } @Override public void ready(ConfigurableApplicationContext context, Duration timeTaken) { SpringApplicationRunListener.super.ready(context, timeTaken); } @Override public void failed(ConfigurableApplicationContext context, Throwable exception) { SpringApplicationRunListener.super.failed(context, exception); } }