? ? ? ? 通过注解我们很方便能注入一个Bean对象,比如说@Component,然而注解在强大也是需要底层接口来实现的,所以仍然有必要了解有哪些方式可以手动注入bean。
一、AnnotationConfigApplicationContext
????????AnnotationConfigApplicationContext提供了很多接口都可以注册bean,列举一些方式:
//普通的类
public class MemberService {
}
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.example");
//注入bean方式1
context.register(MemberService.class);
System.out.println(context.getBean("memberService"));
//注入bean方式2
context.registerBean("memberService1", MemberService.class);
System.out.println(context.getBean("memberService1"));
//注入bean方式3
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(MemberService.class);
context.registerBeanDefinition("memberService2", beanDefinition);
System.out.println(context.getBean("memberService2"));
}
}
二、FactoryBean接口
接口 | 说明 | FactoryBean | 特殊的Bean,这个bean可以创建其他Bean对象,懒加载模式。 | SmartFactoryBean | 继承FactoryBean,在spring启动过程中创建bean对象 |
说明:
1)注意FactoryBean和BeanFactory的区别,FactoryBean是一个Bean对象而BeanFactory是一个工厂
2)注册类型为FactoryBean,但是获取到的类型是其他。
3)懒加载模式
@Component
public class FactoryBeanService implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new MemberService(); //实际类型,getBean的时候才会执行该方法
}
@Override
public Class<?> getObjectType() {
return MemberService.class;
}
/**
* 表示通过FactoryBean生成的对象是单例
* @return
*/
@Override
public boolean isSingleton() {
return true;
}
}
public class App {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext("com.example");
System.out.println("============实际类型=========>");
System.out.println(context.getBean("factoryBeanService"));
System.out.println("<=====================");
System.out.println("============获取BeanFactory类型=========>");
System.out.println(context.getBean("&factoryBeanService"));
System.out.println("<=====================");
}
}
输出结果为MemberService:
============实际类型=========>
com.example.service.MemberService@4fcd19b3
<=====================
============获取BeanFactory类型=========>
com.example.service.FactoryBeanService@376b4233
<=====================
三、BeanDefinitionRegistryPostProcessor接口
接口 | 说明 | BeanFactoryPostProcessor | 最底层接口,只能用于获取BeanDefinition | BeanDefinitionRegistryPostProcessor | 子接口,继承BeanFactoryPostProcessor,用于注册BeanDefinition |
@Component
public class OrderService implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(UserService.class);
registry.registerBeanDefinition("userService", beanDefinition);
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
}
}
public class UserService {
@Autowired
private MemberService memberService;
@Override
public String toString() {
return "UserService{" +
"memberService=" + memberService +
'}';
}
}
通过实现接口,注入UserService这个Bean,由于使用了@Autowired注解,memberService也被注入了?
四、总结
? ? ? ? 以上只是简单的积累一下Spring注入bean对象接口,应该还有其他的接口,后续遇到了在作为补充。
|