springBoot:@Enable&@import&事件监听 (六)

简介: 本文介绍了如何在Spring Boot项目中实现跨项目获取Bean类的方法,包括创建两个项目、在pom文件中导入依赖、定义Bean和配置类、封装注解@EnableStudent以简化导入过程。同时,详细讲解了@Import的四种用法,并展示了如何通过实现ApplicationRunner、CommandLineRunner接口及配置spring.factories文件来执行程序启动时的监听逻辑。

前言

在微服务架构日益普及的今天,跨项目共享 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);
    }
}


相关文章
|
5月前
|
Java Spring 容器
SpringBoot自动装配原理之@Import注解解析
SpringBoot自动装配原理之@Import注解解析
109 0
|
Java Spring 容器
Springboot中的@Import注解~
Springboot中的@Import注解~
|
设计模式 消息中间件 Java
SpringBoot事件监听机制及观察者/发布订阅模式详解
介绍观察者模式和发布订阅模式的区别。 SpringBoot快速入门事件监听。 什么是观察者模式? 观察者模式是经典行为型设计模式之一。 在GoF的《设计模式》中,观察者模式的定义:在对象之间定义一个一对多的依赖,当一个对象状态改变的时候,所有依赖的对象都会自动收到通知。如果你觉得比较抽象,接下来这个例子应该会让你有所感觉:
|
消息中间件 设计模式 Java
SpringBoot事件监听机制及观察者模式/发布订阅模式
SpringBoot事件监听机制及观察者模式/发布订阅模式
367 0
|
Java Spring 容器
Spring Boot - 自动装配中的不可忽视的@Import
Spring Boot - 自动装配中的不可忽视的@Import
148 0
|
Java 应用服务中间件 Spring
SpringBoot Application事件监听的实现方案(动态写入yml)
SpringBoot Application事件监听的实现方案(动态写入yml)
SpringBoot Application事件监听的实现方案(动态写入yml)
|
Java 容器 Spring
【SpringBoot2 从0开始】底层注解 - @Import
【SpringBoot2 从0开始】底层注解 - @Import
【SpringBoot2 从0开始】底层注解 - @Import
|
Java Spring 容器
springboot实战原理(10)--配置事件监听的4种方式和原理
springboot实战原理(10)--配置事件监听的4种方式和原理
526 0
springboot实战原理(10)--配置事件监听的4种方式和原理
【SpringBoot】@Enable*注解和@Import
【SpringBoot】@Enable*注解和@Import