SpringBoot中如何创建bean呢?

欣喜 SpringBoot 发布时间:2024-02-21 11:32:13 阅读数:15107 1
下文笔者讲述SpringBoot创建bean的方法及示例分享,如下所示

spring之bean简介

bean是Spring中的核心
   spring拥有一个大的bean容器,通过spring框架可对这些bean对象进行增强和相关操作
   那么如何将一个对象放入到bean容器中呢?下文笔者将一一道来,如下所示

Spring之bean创建思路

方式1:
    spring.factories

方式2:
    @Configuration + @ComponentScan

方式3:
    @Import直接导入类

方式4:
    @Bean

方式5:
    @Componet + @ComponentScan

方式6:
    FactoryBean接口

方式7:
    BeanDefinitionRegistryPostProcessor

spring.factories

spring.factories
    是springboot加载bean的一种方式
    常用于自动装配环境配置相关的类和Configuration注解功能类似
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.AutoConfigurationClass1,\
  com.example.AutoConfigurationClass2

@Configuration + @ComponentScan

@Configuration注解
   标记SpringBoot中配置类
   其一般与其他Spring的相关配置一起使用 

与@Conditiona簇的注解一起使用,用于在标识该类在满足某种规则后下生效。

@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类
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ RabbitTemplate.class, Channel.class })
@EnableConfigurationProperties(RabbitProperties.class)
@Import({ RabbitAnnotationDrivenConfiguration.class, RabbitStreamConfiguration.class })
public class RabbitAutoConfiguration {
    ...
}

@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实现 

FactoryBean接口

 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 {
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaFramework/SpringBoot/202402/8011.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者