建设网站的建设费用包括seo推广培训费用
springboot动态注入bean
- 1、创建Bean(demo)
- 2、动态注入Bean
- 3、通过注解注入Bean
- 4、通过config配置注入Bean
- 5、通过Import注解导入
- 6、使用FactoryBean接口
- 7、实现BeanDefinitionRegistryPostProcessor接口
1、创建Bean(demo)
@Data
public class Demo(){private String name;public void printName(){System.out.print("动态载入Bean的name属性"+this.name);}
}
2、动态注入Bean
@springbootTest
public class TestDemo(){@Testpublic void test(){// 获取ApplicationContextApplicationContext context = (ApplicatonContext)SpringApplication.run(App.class,args);// 获取BeanFactoryDefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)context.getAutowireCapableBeanFactory();// 创建Bean信息BeanDefinitiontBuilder beanDefinitiontBuilder = BeandefinitionBuilder.genericBeanDefinition(Demo.class);beandefinitionBulider.addPropertyValue("name","小猫咪");// 注入BeanbeanFactory.registerBeanDefinition("demo",beanDefinitionBuilder.getBeanDefinition());// 获取动态注入的BeanDemo demo = applicationContest.getBean("demo");demo.printName();// 移除动态注入的beanbeanFactory.removeBeanDefinition("demo"); }
}
3、通过注解注入Bean
直接在需要注入Bean的类上加这些注解
@RestController
@Service
@Component
4、通过config配置注入Bean
@Configuration标识这个类是一个配置类
@Bean表示这个方法返回的对象,和以前xml配置的Bean一样
5、通过Import注解导入
@import(xxx.class)可以嵌套在启动类上,也可以嵌套在config配置类上
@Import + 实现ImportSelector接口的selectImports方法
@Import + 实现ImportBeanDefinitionRegistrar 接口中的方法
@Import + 实现DeferredImportSelector接口的selectImports方法,DeferredImportSelector 它是 ImportSelector的子接口
6、使用FactoryBean接口
FactoryBean接口和BeanFactory千万不要弄混了,从名字其实可以大概的区分开,FactoryBean, 后缀为bean,那么它其实就是一个bean, BeanFactory,顾名思义 bean工厂,它是IOC容器的顶级接口,这俩接口都很重要。
package com.example.config;import com.example.dto.Demo;
import org.springframework.beans.factory.FactoryBean;public class DemoFactoryBean implements FactoryBean<Demo> {@Overridepublic Bike getObject() throws Exception {return new Demo();}@Overridepublic Class<?> getObjectType() {return Demo.class;}@Overridepublic boolean isSingleton() {return true;}
}
@Configuration
@Import({BikeFactoryBean.class,Dog.class,MyImportSelector.class})
public class MyConfig
7、实现BeanDefinitionRegistryPostProcessor接口
这种方式也是利用到了 BeanDefinitionRegistry,在Spring容器启动的时候会执行 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法,大概意思就是等beanDefinition加载完毕之后,对beanDefinition进行后置处理,可以在此进行调整IOC容器中的beanDefinition,从而干扰到后面进行初始化bean。
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {@Overridepublic void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Demo.class).getBeanDefinition();registry.registerBeanDefinition("Demo", beanDefinition);}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {}
}
@Configuration
@Import({MyBeanDefinitionRegistryPostProcessor.class})
public class MyConfig {