欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 国际 > SpringBoot项目定义Bean常见方式

SpringBoot项目定义Bean常见方式

2025/7/21 18:33:19 来源:https://blog.csdn.net/dj1955/article/details/141509388  浏览:    关键词:SpringBoot项目定义Bean常见方式

1. spring原生的xml 配置bean 现在几乎淘汰,忽略!!

2. @Component 及其衍生注解 (@Controller、@Service、@Repository)

@Component
public class Cat {
}

3. @Configuration + @Bean

@Configuration
public class AnimalConfig {@Beanpublic Dog dog() {return new Dog();}
}

4. 直接使用@Import

public class Bird {
}

 

  4.1 实现 ImportSelector接口

package com.ldj.springboot.importbean.selector;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.util.CollectionUtils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;/*** User: ldj* Date: 2024/8/24* Time: 23:54* Description: No Description*/
public class MyBeanSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {List<String> springBeanPaths = SpringFactoriesLoader.getSpringBeanPaths("spring.factories");if (CollectionUtils.isEmpty(springBeanPaths)) {throw new RuntimeException("spring.factories文件 缺少配置!");}// 这个路径数组你也可以直接写,不需要专门读取配置文件,这里是为了演示springboot读取META-INF 里的spring.factoriesreturn springBeanPaths.toArray(new String[0]);}
}// 读取要注入容器的类所在路径的配置文件
class SpringFactoriesLoader {public static List<String> getSpringBeanPaths(String path) {List<String> classPaths = new LinkedList<>();InputStreamReader inputStreamReader = null;BufferedReader bufferedReader = null;InputStream inputStream = null;String str;try {ClassPathResource classPathResource = new ClassPathResource(path);inputStream = classPathResource.getInputStream();inputStreamReader = new InputStreamReader(inputStream);bufferedReader = new BufferedReader(inputStreamReader);while ((str = bufferedReader.readLine()) != null) {System.out.println(str);classPaths.add(str);}} catch (Exception e) {e.printStackTrace();return null;} finally {try {if (inputStream != null) {inputStream.close();}if (bufferedReader != null) {bufferedReader.close();}if (inputStreamReader != null) {inputStreamReader.close();}} catch (IOException e) {e.printStackTrace();}}return classPaths;}}

  4.2 实现 ImportBeanDefinitionRegistrar 接口

package com.ldj.springboot.importbean.registrar;import com.ldj.springboot.importbean.config.OrderConfig;
import com.ldj.springboot.importbean.config.UserConfig;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;/*** User: ldj* Date: 2024/8/24* Time: 22:22* Description: No Description*/
public class MyBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {AbstractBeanDefinition userConfigBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(UserConfig.class).getBeanDefinition();AbstractBeanDefinition orderConfigBeanDefinition = BeanDefinitionBuilder.genericBeanDefinition(OrderConfig.class).getBeanDefinition();// 以定义态方式注册到容器registry.registerBeanDefinition("userConfig", userConfigBeanDefinition);registry.registerBeanDefinition("orderConfig", orderConfigBeanDefinition);}}
package com.ldj.springboot.importbean;import com.ldj.springboot.importbean.config.*;
import com.ldj.springboot.importbean.registrar.MyBeanDefinitionRegistrar;
import com.ldj.springboot.importbean.selector.MyBeanSelector;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Import;@SpringBootApplication
@Import(value = {Bird.class, MyBeanSelector.class, MyBeanDefinitionRegistrar.class,})
public class ImportBeanApplication {public static void main(String[] args) {AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ImportBeanApplication.class);for (String beanDefinitionName : annotationConfigApplicationContext.getBeanDefinitionNames()) {System.out.println("beanDefinitionName: " + beanDefinitionName);}System.out.println("==========================");// @ComponentSystem.out.println(annotationConfigApplicationContext.getBean(Cat.class));// @Configuration + @BeanSystem.out.println(annotationConfigApplicationContext.getBean(Dog.class));// @ImportSystem.out.println(annotationConfigApplicationContext.getBean(Bird.class));// @Import + ImportSelectorSystem.out.println(annotationConfigApplicationContext.getBean(UserConfig.class));System.out.println(annotationConfigApplicationContext.getBean(OrderConfig.class));//  @Import + ImportBeanDefinitionRegistrar --> (beanDefinition)System.out.println(annotationConfigApplicationContext.getBean(ProductConfig.class));System.out.println(annotationConfigApplicationContext.getBean(StoreConfig.class));// BeanFactoryPostProcessor --> (beanDefinition)System.out.println(annotationConfigApplicationContext.getBean("carService"));}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词