springboot中创建bean的7种方式

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注解一般有以下两种使用方式:

  1. 导入一个或多个配置类:可以使用@Import注解导入其他使用了@Configuration注解的配置类。例如,@Import(MyConfig.class)将会导入名为MyConfig的配置类。
  2. 导入普通的Java类:可以使用@Import注解导入非配置类的Java类,以便在当前配置类中使用该类的实例。例如,@Import(MyService.class)将会导入名为MyService的普通Java类。
  3. 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一般配置复杂,功能多。它也是我们使用的最多的一种方式。它有以下几个特点:

  1. 可以指定bean的名称:可以使用name属性指定bean的名称。如果未指定名称,则将使用方法名作为bean的名称。
  2. 可以指定bean的作用域:可以使用@Scope注解指定bean的作用域。默认情况下,bean的作用域为单例(即在整个应用程序上下文中只有一个实例)。
  3. 可以指定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接口有两个主要方法:

  1. T getObject():该方法返回由工厂创建的对象实例。
  2. 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 {
 
    }
}
复制代码

上面的列子中我们可以看到,我们通过拿到BeanDefinitionRegistry,然后像里面注册了一个user的beanDefinition。后续spring就可以通过registry中的数据来实例话user这个bean了。

总结

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

附录

Conditional

  • ConditionalOnClass 当某些类存在时满足条件
  • ConditionalOnBean 当某些bean存在时满足条件
  • ConditionalOnProperty 当某个属性满足值满足时
  • ConditionalOnCloudPlatform 当某个云平台存在时满足条件
  • ConditionalOnExpression 当某个springEL表达式满足时
  • ConditionalOnJava 当某个java版本匹配时满足条件 @ConditionalOnJava(JavaVersion.NINE)
  • ConditionalOnJndi 当某个JNDI条件满足时 @ConditionalOnJndi({ "java:/JmsXA", "java:/XAConnectionFactory" })
  • ConditionalOnMissingBean 当某些bean缺失时满足条件
  • ConditionalOnMissingClass 当某些类不存在时满足条件
  • ConditionalOnResource 当某些资源存在时
  • ConditionalOnSingleCandidate bean实例为单列或者是满足单个实例的条件
  • ConditionalOnWarDeployment 当应用以war包条件部署时
  • ConditionalOnNotWebApplication 当不是一个应用程序时满足条件
  • ConditionalOnWebApplication 当是一个应用程序时满足条件

作者:阿Qoder
链接:https://juejin.cn/post/722669672335437008

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring Boot提供了多方式来动态创建Bean,以下是其常见的方式: 1. 使用@Bean注解动态创建Bean 在Spring Boot,我们可以使用@Bean注解来创建Bean,只需要在方法上添加@Bean注解,并返回需要创建Bean对象即可。例如: ``` @Configuration public class MyConfig { @Bean public MyBean myBean() { return new MyBean(); } } ``` 2. 使用@Import注解动态创建Bean @Import注解可以用来导入其他配置类,从而实现动态创建Bean的目的。例如: ``` @Configuration @Import(MyBeanConfig.class) public class MyConfig { } ``` 其,MyBeanConfig是一个配置类,用来创建MyBean对象。 3. 使用FactoryBean动态创建Bean FactoryBean是一个接口,可以用来创建复杂的Bean对象。我们可以实现FactoryBean接口,并在实现类实现创建Bean的逻辑。例如: ``` public class MyBeanFactory implements FactoryBean<MyBean> { @Override public MyBean getObject() throws Exception { return new MyBean(); } @Override public Class<?> getObjectType() { return MyBean.class; } @Override public boolean isSingleton() { return true; } } ``` 然后,在配置类使用@Bean注解将MyBeanFactory对象注入到Spring容器: ``` @Configuration public class MyConfig { @Bean public MyBeanFactory myBeanFactory() { return new MyBeanFactory(); } } ``` 这样,当我们需要获取MyBean对象时,只需要从Spring容器获取MyBeanFactory对象,并调用getObject()方法即可。 以上是几常见的动态创建Bean的方式,具体使用哪方式,需要根据具体的业务场景来选择。 ### 回答2: 随着软件开发的不断发展,我们的应用程序越来越复杂,我们需要越来越多的 bean 来管理它们的生命周期。在 Spring 框架的帮助下,我们可以使用依赖注入来管理这些 bean。Spring BootSpring 框架的一个子项目,提供了很多便捷的工具来简化 Spring 的配置,并且可以通过自动配置来减少开发人员的工作负担。本文将会详细介绍 Spring Boot 动态创建 bean 这个重要的功能。 动态创建 bean 通常意味着我们需要在程序运行时根据一些条件来创建实例,而不是在应用程序启动时预先定义 bean。Spring Boot 提供了两主要的方式来实现动态创建 bean: 一、使用@Bean注解 我们可以使用 Spring Boot 的 @Bean 注解来动态创建 bean。@Bean 注解在方法上使用,可以指示 Spring 容器在每次调用时返回该 bean 实例。当我们使用 @Bean 注解时,Spring Boot 将会自动检测程序任何具有 @Configuration 注解的类,并注册其声明的 @Bean 方法。 例如下面代码: ``` @Configuation public class MyConfiguration { @Bean public MyBean myBean() { return new MyBean(); } } ``` 在这个示例,我们创建了一个 @Configuation 类 MyConfiguration,并使用 @Bean 注解依赖注入 MyBean。每次调用 myBean() 方法时,Spring Boot 都会返回一个新的 MyBean 实例。 二、使用@Autowired 注解 另外一方法是在运行时使用 @Autowired 注解来注入 bean。通过创建一个类并注入一个 bean 后,我们可以创建一个新的 bean。例如: ``` @Service public class MyService { @Autowired private ApplicationContext applicationContext; public void dynamicCreateBean() { Object bean = new Object(); // 这里可以根据业务需求创建对象 ((ConfigurableApplicationContext) applicationContext).getBeanFactory().registerSingleton("myBean", bean); } } ``` 在这个示例,我们创建了一个 @Service 类 MyService,并使用 @Autowired 注解依赖注入 ApplicationContext。在方法 dynamicCreateBean() ,我们创建了一个新的对象并将其注册到 Spring 容器使用。我们可以使用任何条件来创建对象并将其注册到 Spring 容器。 总结 本文介绍了 Spring Boot 动态创建 bean 的方法,这对于在运行时根据动态条件创建 bean 的程序非常有用。使用 @Bean 注解或 @Autowired 注解,我们可以在容器启动时创建对象并将其注册到 Spring 容器。动态创建 bean 为我们带来了更强大的编程能力,使我们的应用程序变得更加灵活。 ### 回答3: Spring Boot是一快捷开发框架,支持动态创建Bean,便于应用系统的管理和维护。 在Spring Boot,可以通过注解和反射机制动态创建Bean。下面介绍两动态创建Bean的方式: 1. 使用@Component注解 @Component注解是Spring框架提供的一个基本注解,用于声明一个Bean。通过在类上添加@Component注解,可以实现动态创建Bean。首先需要在配置类添加@ComponentScan注解,该注解可以扫描指定包下所有的类,并将所有添加了@Component注解的类自动注册为Bean。例如: @Configuration @ComponentScan("com.example.service") public class AppConfig { } 下面我们来看一个具体的例子: @Component public class UserService { // ... } AppConfig通过@ComponentScan注解扫描到UserService类,并将其注册为Bean。 2. 使用@Bean注解 @Bean注解是Spring框架提供的另一个注解,用于声明Bean的创建方法。与@Component注解不同的是,@Bean注解需要在配置类手动声明Bean的创建方法。例如: @Configuration public class AppConfig { @Bean public UserService userService() { return new UserService(); } } 上述代码,userService()方法返回一个新的UserService实例,并将其注册为Bean。 总之,在Spring Boot动态创建Bean的方式非常灵活多样,可以根据应用需要灵活使用不同的方式。同时,动态创建Bean的使用也需要注意一些问题,如Bean的依赖关系、Bean的作用域等问题,以保证应用系统的稳定性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值