SpringBoot 中动态的对Bean对象设置和获取

好记忆不如烂笔头,能记下点东西,就记下点,有时间拿出来看看,也会发觉不一样的感受

目录

前言

bean对象的获取

bean对象的设置


前言


现实中,总会有将bean获取或者动态(程序启动时候,通过参数判断是否需要创建bean对象,并放入到applicationcontext中去)将bean放入到springboot全局中去。

bean对象的获取

bean 对象的获取很容易,只需要在ApplicationContext 中拿取就是了,需要 实现的接口是:ApplicationContextAware

代码如下:
 

@Component
public class BootBeanGetter implements ApplicationContextAware {
	private static ApplicationContext applicationContext;
	
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		setApplicationContextStatic(applicationContext);
	}
	
	public static <T> T getClassBean(Class<T> requiredType) {
		return applicationContext.getBean(requiredType);
	}
	
	public static Object getBean(String name){
		return applicationContext.getBean(name);
	}
	
	public static ApplicationContext getApplicationContext() {
		return applicationContext;
	}
	
	public static void setApplicationContextStatic(final ApplicationContext applicationContext) {
		BootBeanGetter.applicationContext = applicationContext;
	}

}

如此就可以在代码中,使用 BootBeanGetter 来获取bean对象了。

bean对象的设置

那么,如何动态设置bean对象呐,此次的bean对象的动态设置,是指在实现了 CommandLineRunner 等接口情况下,通过动态获取配置,进而动态将获取的信息转换得到的bean(根据条件,可能不存在,即无法创建bean)放入到ApplicationContext 中去,操作如下:

@Component
public class BootBeanSetter implements ApplicationContextAware {
	
	/**
	 * 配置bean实例.
	 */
	private static ConfigurableApplicationContext applicationContext;
	
	public BootBeanSetter(ConfigurableApplicationContext applicationContext) {
		this.applicationContext = applicationContext;
	}
	
	/**
	 * 动态将bean放入
	 * @param name
	 * @param clazz
	 * @param args
	 */
	public static void registerBean(String name, Class clazz, Object... args) {
		BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(clazz);
		if (args.length > 0) {
			for (Object arg : args) {
				beanDefinitionBuilder.addConstructorArgValue(arg);
			}
		}
		BeanDefinition beanDefinition = beanDefinitionBuilder.getRawBeanDefinition();
		BeanDefinitionRegistry beanFactory = (BeanDefinitionRegistry) applicationContext.getBeanFactory();
		//注册bean对象.
		beanFactory.registerBeanDefinition(name, beanDefinition);
	}
	
	@Override
	public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
		BootBeanSetter.applicationContext = (ConfigurableApplicationContext) applicationContext;
	}
}

如此操作,可以将动态创建的bean放入到springboot的ApplicationContext 对象中去。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Spring Boot,可以通过以下两种方法获取Bean对象: 1. 使用Autowired注解:在需要使用Bean对象的类上使用Autowired注解,并声明一个对应类型的属性,Spring Boot会自动将对应的Bean注入。 2. 使用ApplicationContext获取:在类通过ApplicationContext获取Spring上下文,然后调用getBean方法获取对应的Bean对象。 ### 回答2: Spring Boot是Spring框架的一种扩展,大大简化了Spring应用程序的开发过程。在Spring BootBean是一个重要概念,它代表了应用对象或者组件。Spring Boot获取Bean对象的方法多种多样,下面将详细介绍。 1. 自动注入 在Spring Boot,通过注解自动注入可以轻松获取Bean对象。Spring Boot自动配置了Bean的管理,我们可以使用注解自动实例化Bean对象。 使用@Autowired、@Resource等注解时,Spring Boot会自动扫描当前包及其子包下的所有类,扫描到该注解时,就会自动实例化Bean对象。 例如: ``` @Service public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; // ... } ``` 这段代码使用了@Autowired注解进行依赖注入,Spring Boot会自动实例化UserDao对象并赋值给userDao变量。 2. 注解 除了自动注入,也可以使用注解来获取Bean对象。Spring Boot提供了多种Bean相关注解。 - @Component:用于标注一个普通的Bean,可以放在类、方法、属性上。 - @Repository:用于标注DAO对象。 - @Service:用于标注Service对象。 - @Controller:用于标注Controller对象。 例如: ``` @Service public class UserServiceImpl implements UserService { @Resource private UserDao userDao; // ... } ``` 这段代码使用了@Resource注解进行依赖注入,其实也可以使用@Autowired注解进行依赖注入。 3. ApplicationContext Spring Boot还提供了ApplicationContext类来获取Bean对象。ApplicationContext是Spring框架的核心接口,用于管理Bean对象。 例如: ``` @Configuration public class AppConfig { @Bean public UserDao userDao() { return new UserDaoImpl(); } } @Service public class UserServiceImpl implements UserService { private UserDao userDao; public UserServiceImpl() { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); this.userDao = context.getBean(UserDao.class); } // ... } ``` 这段代码使用了ApplicationContext类来获取Bean对象,首先定义了一个AppConfig类,创建了一个UserDao类型的Bean,在UserService通过ApplicationContext获取UserDao对象实例。 总之,Spring Boot提供了多种方法来获取Bean对象,开发者可以按照自己的需要选择适合自己的方式。对于初学者来说,推荐使用自动注入的方式获取Bean对象,这种方式简单易用,能够自动管理Bean。对于一些特殊的情况可以使用ApplicationContext来获取Bean对象。 ### 回答3: Spring Boot是Spring框架的一种简化版本,它可以帮助程序员快速构建独立的、生产级别的Spring应用程序。在使用Spring Boot时,我们可以使用自动配置来简化应用程序的配置过程,它会自动为我们创建Bean并将它们注册到Spring容器,程序员可以方便地获取这些Bean对象。 Spring Boot获取Bean对象的方式主要有以下几种: 1. 使用自动注入:在类使用@Autowired或@Inject等注解,在Spring容器查找指定类型的Bean对象,并将其注入到当前类。 2. 使用@Bean注解:在类使用@Bean注解,Spring Boot会自动将标注了@Bean的方法返回的对象注入到Spring容器。 3. 使用@Import注解:在类使用@Import注解,可以将其他的Java配置类加载到Spring容器。 4. 使用@Profile注解:在类或者方法上添加@Profile注解,可以根据不同的环境加载不同的Bean对象。 5. 使用@Qualifier注解:在@Autowired注解使用@Qualifier注解,可以指定要注入的Bean对象的名称。 6. 使用ApplicationContext:通过Spring的ApplicationContext接口获取Bean对象,可以手动查询和获取Bean对象。 以上就是Spring Boot获取Bean对象的主要方式,程序员可以根据自己的需要和实际情况选择适合自己的方式获取Bean对象。同时,在Spring Boot还有其他的一些方式获取Bean对象,开发人员可以根据自己的需求和情况进行选择和使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值