Spring从入门到精通(十)—面试官:FactoryBean 和 BeanFactory有啥区别

网友投稿 512 2022-11-02

Spring从入门到精通(十)—面试官:FactoryBean 和 BeanFactory有啥区别

Spring从入门到精通(十)—面试官:FactoryBean 和 BeanFactory有啥区别

BeanFactory接⼝是容器的顶级接⼝,定义了容器的⼀些基础⾏为,负责⽣产和管理Bean的⼀个⼯⼚,具体使⽤它下⾯的⼦接⼝类型,⽐如ApplicationContext;此处我们重点分析FactoryBean。Spring中Bean有两种,⼀种是普通Bean,⼀种是⼯⼚Bean(FactoryBean),FactoryBean可以⽣成某⼀个类型的Bean实例(返回给我们),也就是说我们可以借助于它⾃定义Bean的创建过程。Bean创建的三种⽅式中的静态⽅法和实例化⽅法和FactoryBean作⽤类似,FactoryBean使⽤较多,尤其在Spring框架⼀些组件中会使⽤,还有其他框架和Spring框架整合时使⽤。

// 可以让我们⾃定义Bean的创建过程(完成复杂Bean的定义) public interface FactoryBean { @Nullable // 返回FactoryBean创建的Bean实例,如果isSingleton返回true,则该实例会放到Spring容器的单例对象缓存池中Map T getObject() throws Exception; @Nullable // 返回FactoryBean创建的Bean类型 Class getObjectType(); // 返回作⽤域是否单例 default boolean isSingleton() { return true; } }

User类

public class User { private String name; private String addr; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", addr='" + addr + '\'' + '}'; } }

UserFactoryBean类

public class UserFactoryBean implements FactoryBean { private String userInfo; // 用户姓名,地址 public void setUserInfo(String userInfo) { this.userInfo = userInfo; } @Override public User getObject() throws Exception { // 模拟创建复杂对象User User user = new User(); String[] strings = userInfo.split(","); user.setName(strings[0]); user.setAddr(strings[1]); return user; } @Override public Class getObjectType() { return User.class; } @Override public boolean isSingleton() { return true; } }

xml配置

测试,获取FactoryBean产⽣的对象

Object userBean = applicationContext.getBean("userBean"); System.out.println("bean:" + userBean); // 结果如下 bean:User{name='詹先生', addr='hangzhou'}

测试,获取FactoryBean,需要在id之前添加“&”

Object userBean = applicationContext.getBean("&userBean"); System.out.println("bean:" + userBean); // 结果如下 bean:com.zjq.factory.UserFactoryBean@65f6cd78

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:一个简单而灵活的React实用程序组件,用于将文本复制到剪贴板
下一篇:car-eye-device 是车辆管理系统的设备端程序,负责视频采集,gps采集等
相关文章

 发表评论

暂时没有评论,来抢沙发吧~