1 FactoryBean接口的使用
1.1 FactoryBean接口的使用
2.4 Spring5 自定义标签案例3.7 spring 识别自定义实现BeanFactoryPostProcessor 的接口4.8 springboot源码解析(四):监听器5.11 replace-method标签使用6.10 lookup-method标签使用7.通过FactoryMethod创建对象示例8.通过Supplier创建对象示例9.InstantiationAwareBeanPostProcessor 接口实现10.对象Constructor构造函数和@PostConstruct&@PreDestroy解析详解11.自定义转换器Converter实现案例12.三级缓存解析过程13.JDK proxy 和cglib 源码解读一般情况下,Spring通过反射机制利用bean的class属性指定实现类来实例化bean。在某些情况下,实例化bean过程比较复杂,如果按照传统的方式,则需要在
1 创建User对象#
package com.gientech.factoryBean;
public class User {
private String id;
private String userName;
private String email;
private String password;
public User(String userName) {
this.userName = userName;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2 创建MyFactoryBean#
package com.gientech.factoryBean;
import org.springframework.beans.factory.FactoryBean;
public class MyFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User("wangmazi");
}
@Override
public Class<?> getObjectType() {
return User.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
3 修改xml配置文件#
<bean id="userFactory" class="com.gientech.factoryBean.MyFactoryBean">
<property name="userInfo" value="1,zhangsan,123456@163.com,123qaz"></property>
</bean>
4 测试code和截图#
-
4.1 场景一:获取实现了BeanFactory接口类的对象#
ApplicationContext ac = new ClassPathXmlApplicationContext("factoryBean.xml");
// 获取实现了BeanFactory接口类的对象
MyFactoryBean factoryBean = (MyFactoryBean) ac.getBean("&userFactory");
System.out.println(factoryBean);
此时factoryBean 由Spring管理,且存储于一级缓存中,如下图所示。
-
4.2 场景二:factoryBean#getObject的返回对象存储于factoryBeanObjectCache缓存中#
测试code
ApplicationContext ac = new ClassPathXmlApplicationContext("factoryBean.xml");
// 获取实现了BeanFactory接口类的对象
MyFactoryBean factoryBean = (MyFactoryBean) ac.getBean("&userFactory");
System.out.println(factoryBean);
User bean2 = (User) ac.getBean("userFactory");
System.out.println(bean2.getUserName()+ " ---- " + bean2.getEmail());
bean2是通过getObjectForBeanInstance(sharedInstance, name, beanName, null); 方法创建,此时,factoryBean 由Spring管理,且存储于一级缓存中,bean2存储于factoryBeanObjectCache 缓存中。如下图所示:
-
4.3 场景三:factoryBean#getObject的返回对象为单例时,只有一个对象存储于factoryBeanObjectCache缓存中#
当User.isSingleton() 返回true时, bean2 会存入factoryBeanObjectCache缓存中,bean3 会从缓存中获取,代码和截图所示。
ApplicationContext ac = new ClassPathXmlApplicationContext("factoryBean.xml");
// 获取实现了BeanFactory接口类的对象
MyFactoryBean factoryBean = (MyFactoryBean) ac.getBean("&userFactory");
System.out.println(factoryBean);
User bean2 = (User) ac.getBean("userFactory");
System.out.println(bean2.getUserName()+ " ---- " + bean2.getEmail());
User bean3 = (User) ac.getBean("userFactory");
System.out.println(bean3.getUserName()+ " ---- " + bean3.getEmail());
-
4.3 场景四:factoryBean#getObject的返回对象不为单例时,不由Spring管理,也不存储于factoryBeanObjectCache缓存中#
当User.isSingleton() 返回false时,不是单例对象,bean2,bean3 不会存入factoryBeanObjectCache缓存中,bean2,bean3 都会重新创建,代码和运行截图所示。
package com.gientech.factoryBean;
import org.springframework.beans.factory.FactoryBean;
public class MyFactoryBean implements FactoryBean<User> {
private String userInfo;
public String getUserInfo() {
return userInfo;
}
public void setUserInfo(String userInfo) {
this.userInfo = userInfo;
}
@Override
public User getObject() throws Exception {
User user = new User();
String[] arr = userInfo.split(",");
user.setId(arr[0]);
user.setUserName(arr[1]);
user.setEmail(arr[2]);
user.setPassword(arr[3]);
return user;
}
@Override
public Class<?> getObjectType() {
return User.class;
}
// 此处返回为false
@Override
public boolean isSingleton() {
return false;
}
}
ApplicationContext ac = new ClassPathXmlApplicationContext("factoryBean.xml");
// 获取实现了BeanFactory接口类的对象
MyFactoryBean factoryBean = (MyFactoryBean) ac.getBean("&userFactory");
System.out.println(factoryBean);
User bean2 = (User) ac.getBean("userFactory");
System.out.println(bean2);
User bean3 = (User) ac.getBean("userFactory");
System.out.println(bean3);
作者:zgcy123456
出处:https://www.cnblogs.com/zgcy123456/p/18055443
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
合集:
Spring5 源码
标签:
Spring5 源码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能