手動向Spring容器中注入對象的方法有很多,本文將簡單闡述其中的四種
1. beanFactory的registerSingleton方法
我們可以實現一個BeanFactory的后置處理器崔涂,在其中就可以獲得BeanFactory冷蚂,這樣就可以調用registerSingleton方法汛闸。
注:此處bean的名字可以自定義,如這里就定義為sherlock诸老。
@Component
public class SherlockBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
beanFactory.registerSingleton("sherlock", new User("sherlock", 18));
}
}
如果在容器中獲取該類
@Test
public void test() {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
User sherlock = context.getBean("sherlock", User.class);
System.out.println(sherlock.toString());
}
控制臺輸出:
對象就已成功注入到Spring容器中了蹄衷。
注:其實在context中也有registerBean方法厘肮,可以實現一樣的效果。(ApplicationContext其實繼承了BeanFactory耍属,所以它也擁有Bean工廠的功能巩检,除此之外ApplicationContext還繼承了很多其他的類,擁有一些輔助功能领舰√嶙幔總的來說煮仇,ApplicationContext其實包括了BeanFactory)
2. @Bean注解
在配置類中,使用@Bean注解刨仑,返回一個想要注入的對象。@Bean括號中是bean的名字辙诞,默認為類名的小寫形式轻抱。
@Configuration
@ComponentScan("com.sherlock")
public class AppConfig {
@Bean("sherlock")
public User user() {
return new User("sherlock", 19);
}
}
控制臺輸出:
3. 使用Factory‘Bean
既然提到了Factory‘Bean祈搜,就不得不提到BeanFactory。關于這兩個的區(qū)別梁呈,可以看下我的另一篇文章官卡。http://www.reibang.com/p/91d21128d2a9
我們可以創(chuàng)建一個類去實現FactoryBean接口
@Component
public class SherlockFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new User("sherlock", 20);
}
@Override
public Class<?> getObjectType() {
return User.class;
}
}
//注意:這個bean的名字是sherlockFactoryBean醋虏,但返回的是User類
User user = context.getBean("sherlockFactoryBean", User.class);
控制臺輸出:
4. 使用@Import注解
@Import只能用在類上 仔涩,@Import通過快速導入的方式實現把實例加入spring的IOC容器中
@Import的三種用法主要包括:
- 直接填class數組
@Import({User.class, Order.class})
User user = context.getBean("com.sherlock.pojo.User", User.class);
注意:這樣注入的類名為類的全限定名粘舟。
- ImportSelector方式
使用這種方式的這個類必須實現ImportSelector接口
public class SherlockImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//前面可以是和業(yè)務相關的邏輯
//返回需要導入的組件的全類名數組
return new String[]{"com.sherlock.pojo.User"};
}
}
- ImportBeanDefintionRegister方式手動注冊bean
public class SherlockImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//需要的業(yè)務邏輯
//指定bean定義信息(包括bean的類型柑肴、作用域...)
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(User.class);
registry.registerBeanDefinition("user",beanDefinition);
}
}
@Import三種方式的總結
第一種用法:@Import({ 要導入的容器中的組件 } ):容器會自動注冊這個組件,id默認是全類名
第二種用法:ImportSelector:返回需要導入的組件的全類名數組晰骑,springboot底層用的特別多硕舆。
第三種用法:ImportBeanDefinitionRegistrar:手動注冊bean到容器
好了,以上就是四種手動向Spring容器中注入對象的方法扬跋×杞冢總結一下吧,分別是:
- beanFactory的registerSingleton方法
- @Bean注解
- FactoryBean
- @Import