SpringBoot中创建bean的7种方式总结

 更新时间:2023年07月12日 11:20:00   作者:Aqoo  
Spring是一款广泛应用于企业级应用程序开发的Java框架,其 IOC 和 DI 特性可以有效地管理应用程序中的对象,提高了应用程序的可维护性和可扩展性,那你知道spring有哪些方式将bean放入容器嘛,今天就给大家总结一下

spring.factories

使用 spring.factories是springboot加载bean的一种方式,通常用于自动装配环境配置相关的类,和Configuration注解有异曲同工之妙。

其机制和java的SPI机制类似,不同的是其配置规则 : spring.factories以key,value的键值对列表存在。value是类的完全限定类名。类之间用逗号(,)分隔,后面跟着反斜杠(\)和换行符,以提高可读性。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.AutoConfigurationClass1,\
  com.example.AutoConfigurationClass2

@Configuration + @ComponentScan

@Configuration顾名思义就是我们的环境配置,标记SpringBoot中的配置类。其一般与其他Spring的相关配置一起使用。内部的话就是我们需要注入到spring容器的bean。

  • 与@Conditiona簇的注解一起使用,用于在标识该类在满足某种规则后下生效。
  • 在配置类中我们也可以添加@import注解导入某些类。
  • 一般我们的配置类如果在启动类包路径下的话,SpringBoot可以自行装配,无需其他配置去扫描发现。但是如果不是的话,则需要配置 @ComponentScan或者 spring.factories文件了。一般我们开发一个框架的话,推荐使用spring.factories的方式,这样使用者导入相应的jar包(一般是spring-starter包)即可自动装配相应的bean。

如下的nacos中的服务发现配置:

@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
public class NacosDiscoveryAutoConfiguration {
	@Bean
	@ConditionalOnMissingBean
	public NacosDiscoveryProperties nacosProperties() {
		return new NacosDiscoveryProperties();
	}
	@Bean
	@ConditionalOnMissingBean
	public NacosServiceDiscovery nacosServiceDiscovery(
			NacosDiscoveryProperties discoveryProperties,
			NacosServiceManager nacosServiceManager) {
		return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager);
	}
}

@Import直接导入类

在Spring框架中,@Import注解用于导入一个或多个配置类或普通的Java类,以便在当前的配置类中使用。它可以在@Configuration注解的类中使用,用于引入其他类的定义,以便在当前类中使用这些定义。

@Import注解一般有以下两种使用方式:

  • 导入一个或多个配置类:可以使用@Import注解导入其他使用了@Configuration注解的配置类。例如,@Import(MyConfig.class)将会导入名为MyConfig的配置类。
  • 导入普通的Java类:可以使用@Import注解导入非配置类的Java类,以便在当前配置类中使用该类的实例。例如,@Import(MyService.class)将会导入名为MyService的普通Java类。
  • Import只能在类上使用。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import({ RabbitAnnotationDrivenConfiguration.class, RabbitStreamConfiguration.class })
public class RabbitAutoConfiguration {
    ...
}

上述配置示例就又导入了两个配置类:RabbitAnnotationDrivenConfiguration,RabbitStreamConfiguration。

@Bean

注解@Bean一般用于向spring中注入一个比较复杂的bean,这个bean一般配置复杂,功能多。它也是我们使用的最多的一种方式。它有以下几个特点:

  • 可以指定bean的名称:可以使用name属性指定bean的名称。如果未指定名称,则将使用方法名作为bean的名称。
  • 可以指定bean的作用域:可以使用@Scope注解指定bean的作用域。默认情况下,bean的作用域为单例(即在整个应用程序上下文中只有一个实例)。
  • 可以指定bean的初始化和销毁方法:可以使用@PostConstruct和@PreDestroy注解指定bean的初始化和销毁方法。
@Configuration
public class MyConfiguration {
    @Bean
    public User user() {
        User user = new User();
        User.setName("凹凸曼");
        return user;
    }
}

@Componet + @ComponentScan

@Componet注解也是我们使用的比较多的注解,可能我这样说你比较疑惑。但是@Controller,@Service,@Repository这些注解你熟悉吧,他们都是基于@Componet实现的。其和@ComponentScan注解搭配使用,通过扫描某个包路径来实现导入。

FactoryBean接口

FactoryBean千万不要和BeanFactory搞混了喔。BeanFactory是spring的bean管理工厂用于管理Spring中的bean的,它是IOC容器的顶级接口,。FactoryBean是用来创建复杂的或自定义bean的。

FactoryBean接口有两个主要方法:

  • T getObject():该方法返回由工厂创建的对象实例。
  • Class<?> getObjectType():该方法返回由工厂创建的对象的类型。

我们来看一个列子:

@Configuration
public class TestConfiguration {
    @Bean
    public UserFactoryBean userFactoryBean() {
        return new UserFactoryBean();
    }
    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TestConfiguration.class);
        Person bean = applicationContext.getBean(User.class);
        System.out.println(bean);
    }
}
class UserFactoryBean implements FactoryBean<User> {
    /**
     *  直接new出来User进行返回.
     */
    @Override
    public User getObject() throws Exception {
        return new User();
    }
    /**
     *  指定返回bean的类型.
     */
    @Override
    public Class<?> getObjectType() {
        return User.class;
    }
}

BeanDefinitionRegistryPostProcessor

这个提供的一个扩展点,BeanDefinitionRegistryPostProcessor接口是spring提供的一个扩展点,用于允许开发者在应用程序上下文启动时动态修改或注册bean定义。它允许开发者在应用程序上下文创建bean之前对bean定义进行更改或添加新的bean定义。

class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
        registry.registerBeanDefinition("user", beanDefinition);
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
    }
}

总结

上诉我们一共介绍了7种创建bean的方式,希望对大家有所帮助,以上内容就到这里,感谢各位看官老爷们的观看,如果觉得写得好,给个赞支持一下哈!!!

到此这篇关于SpringBoot中创建bean的7种方式总结的文章就介绍到这了,更多相关SpringBoot创建bean内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 你知道Spring如何解决所有循环依赖的吗

    你知道Spring如何解决所有循环依赖的吗

    这篇文章主要来和大家聊聊Spring 能解决所有循环依赖吗,文中的示例代码讲解详细,对我们学习Spring有一定的帮助,需要的小伙伴可以参考一下
    2023-07-07
  • SpringBoot项目中jar发布获取jar包所在目录路径的最佳方法

    SpringBoot项目中jar发布获取jar包所在目录路径的最佳方法

    在开发过程中,我们经常要遇到上传图片、word、pdf等功能,但是当我们把项目打包发布到服务器上时,对应的很多存储路径的方法就会失效,下面这篇文章主要给大家介绍了关于SpringBoot项目中jar发布获取jar包所在目录路径的相关资料
    2022-07-07
  • Java内存泄漏问题处理方法经验总结

    Java内存泄漏问题处理方法经验总结

    今天小编就为大家分享一篇关于Java内存泄漏问题处理方法经验总结,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • java数组输出的实例代码

    java数组输出的实例代码

    这篇文章主要介绍了java数组输出的实例代码,有需要的朋友可以参考一下
    2013-12-12
  • Java使用POI导出Excel(一):单sheet

    Java使用POI导出Excel(一):单sheet

    这篇文章介绍了Java使用POI导出Excel的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-10-10
  • springMVC实现图形验证码(kaptcha)代码实例

    springMVC实现图形验证码(kaptcha)代码实例

    这篇文章主要介绍了springMVC实现图形验证码(kaptcha)代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
    2019-09-09
  • Springboot实现Excel批量导入数据并保存到本地

    Springboot实现Excel批量导入数据并保存到本地

    这篇文章主要为大家详细介绍了Springboot实现Excel批量导入数据并将文件保存到本地效果的方法,文中的示例代讲解详细,需要的可以参考一下
    2022-09-09
  • 使用ClassFinal实现SpringBoot项目jar包加密的操作指南

    使用ClassFinal实现SpringBoot项目jar包加密的操作指南

    在实际开发中,保护项目的安全性和保密性是至关重要的,针对于 Spring Boot 项目,我们需要将 JAR 包进行加密从而有效地防止未经授权的访问和修改,本文将介绍如何使用ClassFinal在 Spring Boot 项目中实现 JAR 包加密,需要的朋友可以参考下
    2024-06-06
  • Java用BigDecimal类解决Double类型精度丢失的问题

    Java用BigDecimal类解决Double类型精度丢失的问题

    这篇文章主要介绍了Java用BigDecimal类解决Double类型精度丢失的问题,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-12-12
  • Java顺时针打印矩阵

    Java顺时针打印矩阵

    这篇文章主要为大家详细介绍了Java顺时针打印矩阵,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03

最新评论