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 {
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


