首页 > 其他分享 >springboot 注册 bean

springboot 注册 bean

时间:2024-07-05 13:41:36浏览次数:12  
标签:run springboot class bean User 注册 Import public

都是 spring 支持的,@Import 我也是从 spring 的文章张直接复制出来的,那边文章详细解释了 bean 的方方面面,感兴趣可以去看

@Configuration、@Bean

相当于 spring 的配置文件,spring 在配置文件中可以配置 bean,用注解方式就是这样的

// 这个类也会作为一个 bean
@Configuration
public class MyConfig {

    // 方法名就是 bean 唯一标识
    @Bean
    public User user(){
        User user = new User();
        user.setUsername("Marry");
        user.setId(12345L);
        return user;
    }

}

要让代码有语义,这种方式可以配置 bean,但是 @Configuration 的语义是代替 spring 的配置文件,如果只是想单纯配置一个 bean 其实这种方式并不清晰

如果只是单纯想配置一个 bean 使用 @Component 方式会更好

@Component

@Component
public class User {
    private Long id;
    private String username;

    // getter setter
}

@Service、@Repository、@Controller 也是注册 bean,但是语义上不同(和上面的 @Configuration 一样,虽然都已配置 bean,但是还是建议符合语义的去配置)

@Import

有三种用法,导入的 bean 的唯一 id 是类的权限定名

@Import(A.class)                               // 导入普通类
@Import(MyImportSelector.class)                // 导入实现了 ImportSelector 的类
@Import(MyImportBeanDefinitionRegister.class)  // 需实现 ImportBeanDefinitionRegistrar 接口
  1. 导入普通类

    /**
     * 这是一个普通的类,没有任何注解
     */
    public class User {
        private String name;
    }
    
    
    /**
     *  直接使用 @Import 导入User类到IOC容器中
     */
    @Import(User.class)
    @SpringBootApplication
    public class SpringConfig {
        
        public static void main(String[] args) {
           ConfigurableApplicationContext run = SpringApplication.run(SpringConfig.class, args);
            // 这种方式由于未定义 Bean id 和 name, getBean 时只能用类的class去拿或者类的权限定名
            User bean = run.getBean(User.class);
            System.out.println(bean);
        }
    }
    
    
  2. 导入实现了 ImportSelector 的类(能批量导入,原理是注册一批 BeanDefinition)

    // 一个实现了 ImportSelector 接口的类
    public class MyImportSelector implements ImportSelector {
        @Override
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
            // 参数 importingClassMetadata 可以获取当前类被 @Import 导入的类的所有注解信息(有点绕看下面)
            
            // 返回值是个数组,数组的每一项都会导入 ioc 容器
            return new String[]{User.class.getName(), Order.class.getName()};
        }
    }
    
    
    // importingClassMetadata 就是能获取这个类的所有注解信息,SpringBootConfiguration、EnableAutoConfiguration、ComponentScan 等
    @Import(MyImportSelector.class)
    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
    		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public class SpringConfig {
        
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(SpringConfig.class, args);
            User bean = run.getBean(User.class);
            System.out.println(bean);
        }
    }
    
  3. 导入实现了 ImportBeanDefinitionRegistrar 的类

    // 一个实现了 ImportBeanDefinitionRegistrar 接口的类
    public class MyBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
        @Override
    	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            // 创建一个 BeanDefinition 
            AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
    		// 注册到 ioc 容器
    		registry.registerBeanDefinition("user", beanDefinition);
        }
    }
    
    
    @Import(User.class)
    @SpringBootApplication
    public class SpringConfig {
        public static void main(String[] args) {
            ConfigurableApplicationContext run = SpringApplication.run(SpringConfig.class, args);
            User bean = run.getBean(User.class);
            System.out.println(bean);
        }
    }
    

秀肌肉

// 定义一个注解,导入 MyBeanDefinitionRegister
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import(MyBeanDefinitionRegister.class)
public @interface CyrusScan{
    
}

// 定义 MyBeanDefinitionRegister
public class MyBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
    @Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
		registry.registerBeanDefinition("user", beanDefinition);
    }
}

// 启动类或配置类使用自定义注解 CyrusScan,就会自动注册 User 类型的 bean
@SpringBootConfiguration
@CyrusScan
public class SpringConfig {
    
}


标签:run,springboot,class,bean,User,注册,Import,public
From: https://www.cnblogs.com/cryus/p/18285643

相关文章

  • BeanUtil复制时,两对象中数据类型不一致导致的问题Can not set java.time.LocalDateTim
    @DatapublicclassAVo{privateLongendTime;privateStringname;privateStringid;}@DatapublicclassABVo{privateLocalDateTimeendTime;privateStringname;privateStringid;}AVoaVo=newAVo();......
  • 基于Java+SpringBoot+Vue的学生宿舍管理系统的设计与开发(源码+lw+部署文档+讲解等)
    文章目录前言项目背景介绍技术栈后端框架SpringBoot前端框架Vue数据库MySQL(MyStructuredQueryLanguage)具体实现截图详细视频演示系统测试系统测试目的系统功能测试系统测试结论代码参考数据库参考源码获取前言......
  • springboot 如何指定 active 的 application yaml
    在SpringBoot项目中,你可以通过多种方式指定要使用的`application.yml`文件中的`active`配置文件(profile)。指定activeprofile的方法主要包括以下几种:###1.使用命令行参数当你通过命令行启动SpringBoot应用程序时,可以使用`--spring.profiles.active`参数来指定a......
  • springboot 中推荐使用哪些比较好的 web 客户端 SDK
    在SpringBoot中,有几种常用和推荐的Web客户端SDK,可以用于与RESTful或其他类型的Web服务进行交互。1.SpringWebClientSpringWebClient是Spring5中引入的非阻塞、响应式的Web客户端,推荐用于现代SpringBoot应用。特点响应式编程:支持响应式编程模型,适用于需......
  • 9.Bean的生命周期
    packagecom.xkj.org;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.stereotype.Component;impo......
  • springboot+vue+mybatis前台点菜系统+PPT+论文+讲解+售后
    21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。论文主要是对前台点菜系统进行了介绍,......
  • springboot+vue+mybatis企业保修系统+PPT+论文+讲解+售后
    企业管理系统提供给用户一个企业信息管理的系统,最新的企业信息让用户及时了解企业管理动向,,还能通过交流区互动更方便。本系统采用了B/S体系的结构,使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、员工和主管三个部分,系统管理员主要功能包括主页、个......
  • springboot 如何使用MongoDB集成 shedlock-spring
    ShedLock是一个用于防止在分布式环境中任务重复执行的库。它允许多个节点共享一个任务调度器,并确保同一时间只有一个节点能够执行某个任务。SpringBoot项目中可以通过集成shedlock-spring来实现这一功能。下面是一个完整的集成指南:1.添加依赖首先,需要在pom.xml中添加sh......
  • springboot 中每分钟执行一次的 cron 表达式怎么写
    在SpringBoot中,如果你需要使用Cron表达式来每分钟执行一次任务,可以使用Spring的@Scheduled注解。Cron表达式是一种用来表示时间点的字符串,通过这些字符串,你可以非常灵活地定义任务的执行时间。Cron表达式格式Cron表达式由六个或七个字段组成,按以下顺序排列:秒(Seconds):0-59分......
  • 基于SpringBoot的财务管理系统
    系统主要包括首页,个人中心,员工管理,部门管理,员工工资管理,工资调整管理,资产类别管理,固定资产管理,经营信息管理,序时账管理,年度利润管理,系统管理等功能模块。......