闽公网安备 35020302035485号
public interface BeanFactory {
// 获取Bean的方法
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
// 堆代码 duidaima.com
// 检查Bean是否存在
boolean containsBean(String name);
// 判断Bean是否为单例
boolean isSingleton(String name) throws BeansException;
// 判断Bean是否为原型
boolean isPrototype(String name) throws BeansException;
// 检查Bean是否与指定类型匹配
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws BeansException;
// 获取Bean的类型
Class<?> getType(String name) throws BeansException;
// 获取Bean的别名
String[] getAliases(String name);
}
主要实现类ApplicationContext:虽然ApplicationContext是BeanFactory的子接口,但它提供了更多企业级功能,如国际化支持、事件发布等,是实际开发中更常用的容器。
返回Bean实例:将初始化完成的Bean返回给调用者。
// 创建BeanFactory实例
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
// 加载XML配置文件
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(new ClassPathResource("applicationContext.xml"));
// 获取Bean实例
UserService userService = (UserService) beanFactory.getBean("userService");
userService.doSomething();
FactoryBean 详解public interface FactoryBean<T> {
// 返回由FactoryBean创建的Bean实例
T getObject() throws Exception;
// 返回由FactoryBean创建的Bean的类型
Class<?> getObjectType();
// 指示由FactoryBean创建的Bean是否为单例
boolean isSingleton();
}
工作原理如果需要获取FactoryBean本身,则需要在beanName前加上&前缀,如getBean("&myFactoryBean")。
public class UserFactoryBean implements FactoryBean<User> {
private String username;
private String password;
private int age;
// 构造函数注入参数
public UserFactoryBean(String username, String password, int age) {
this.username = username;
this.password = password;
this.age = age;
}
@Override
public User getObject() throws Exception {
// 复杂的对象创建逻辑
User user = new User();
user.setUsername(username);
user.setPassword(encryptPassword(password)); // 密码加密
user.setAge(age);
user.setCreateTime(new Date());
user.setStatus(UserStatus.ACTIVE);
return user;
}
@Override
public Class<?> getObjectType() {
return User.class;
}
@Override
public boolean isSingleton() {
returnfalse; // 每次获取都创建新实例
}
// 密码加密方法
private String encryptPassword(String password) {
// 实际项目中可能使用更复杂的加密算法
return DigestUtils.md5DigestAsHex(password.getBytes());
}
}
BeanFactory 与 FactoryBean 的区别与联系| 特性 | BeanFactory | FactoryBean |
|---|---|---|
| 角色 | Spring IoC 容器的顶层接口,负责管理所有 Bean | 特殊的 Bean,用于创建其他 Bean 的工厂 |
| 功能 | 提供 Bean 的注册、实例化、依赖注入等完整功能 | 仅负责创建特定类型的 Bean,封装创建逻辑 |
| 关注点 | 整体的 Bean 生命周期管理 | 特定 Bean 的创建过程 |
| 使用方式 | 作为容器直接使用或扩展 | 实现其接口,将其注册为 Bean,用于创建其他 Bean |
| 懒加载 | 默认采用懒加载策略 | 由其getObject()方法的实现决定 |