Spring中BeanFactory与FactoryBean接口的区别详解

论坛 期权论坛 脚本     
niminba   2021-5-23 02:56   2268   0

前言

Spring框架中的BeanFactory接口和FactoryBean接口因为名称相似,老是容易搞混淆,而且也是面试过程中经常会碰到的一个问题。所以本文就专门给大家整理出来。

一、BeanFactory接口

BeanFactory接口是Spring容器的核心接口,负责:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。

Spring为我们提供了许多易用的BeanFactory实现,XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。XmlBeanFactory类将持有此XML配置元数据,并用它来构建一个完全可配置的系统或应用。

BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
Object bean = bf.getBean(IUserService.class);
System.out.println(bean);

接口中定义的方法

public interface BeanFactory {

 String FACTORY_BEAN_PREFIX = "&";

 Object getBean(String name) throws BeansException;

 <T> T getBean(String name, Class<T> requiredType) throws BeansException;

 Object getBean(String name, Object... args) throws BeansException;

 <T> T getBean(Class<T> requiredType) throws BeansException;

 <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

 boolean containsBean(String name);

 boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

 boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

 boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

 Class<?> getType(String name) throws NoSuchBeanDefinitionException;

 String[] getAliases(String name);
}

二、FactoryBean接口

BeanFactory接口是Spring的核心接口。功能非常复杂,这个时候如果我们想要编写一些比较复杂点儿的逻辑就会触及到其他一些不必要的接口,不好实现。这时候使用FactoryBean就比较方便了。FactoryBean以Bean结尾是个Bean对象,不是工厂。接口中定义的方法如下:

public interface FactoryBean<T> {

 /**
  * 返回对象的实例
  */
 T getObject() throws Exception;

 /**
  * 返回对象的类型
  */
 Class<?> getObjectType();

 /**
  * 是否是单例
  */
 boolean isSingleton();
}

1.简单实现

接口和实现类

public interface IUserService {

 public void doSome();
}
public class UserServiceImpl implements IUserService {
 public UserServiceImpl(){
  System.out.println("--被实例化了--");
 }

 @Override
 public void doSome() {
  System.out.println("UserServiceImpl 。。。 被执行了");
 }
}

自定义FactoryBean

public class MyFactoryBean implements FactoryBean<IUserService>{

 @Override
 public IUserService getObject() throws Exception {
  System.out.println("--IUserService实例化之前---");
  IUserService service = new UserServiceImpl();
  System.out.println("--IUserService实例化后---");
  return service;
 }

 @Override
 public Class<?> getObjectType() {
  return IUserService.class;
 }

 @Override
 public boolean isSingleton() {
  return true;
 }
}

配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans.xsd">
 <bean id="myFactoryBean" class="com.dpb.factorybean.MyFactoryBean"/>
</beans>

测试--通过类型获取

@Test
public void test1() {
 BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
 Object bean = bf.getBean(IUserService.class);
 System.out.println(bean);
}

输出结果

--IUserService实例化之前---
--被实例化了--
--IUserService实例化后---
com.dpb.service.UserServiceImpl@5315b42e

测试--通过id获取

@Test
public void test1() {
 BeanFactory bf = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
 Object bean = bf.getBean("myFactoryBean");
 System.out.println(bean);
}

输出结果

--IUserService实例化之ZT4(驅4)=4(РrV4(MMM(MMMM%=4( 4(a51 rV4(M 4(4(=4(MMРMР(M(4(4(=4( MMMMM(4(4(=4(4(vC4(驅4(4(%剅%4(剅4(4(4(屔L4(4(4( bM=rj:>%=&rj~:> "Gj ''R:> b: :>Ob6Wj: 7ro{::r'?jZW b7k: :o3^jR"C Q rRj^gcr': 3?wr3v7jcrj?crbZj3rorZj疾疒j惚"[r'kj> 惒瞒jR2

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:1060120
帖子:212021
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP