SpringBoot中如何创建bean呢?
下文笔者讲述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 { } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。