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()方法的实现决定 |