2026/2/17 19:06:55
网站建设
项目流程
高档网站建设公司,已注册的网站如何注销,百度收录收费 重大网站,seo 页面链接优化Spring Bean工厂原理与类关系详解
一、核心概念
1.1 Bean
Bean是由Spring容器管理的对象#xff0c;可以是任何Java类的实例。Spring容器负责Bean的创建、初始化、配置和管理生命周期。
1.2 Bean工厂
Bean工厂#xff08;BeanFactory#xff09;是Spring框架中负责创建…Spring Bean工厂原理与类关系详解一、核心概念1.1 BeanBean是由Spring容器管理的对象可以是任何Java类的实例。Spring容器负责Bean的创建、初始化、配置和管理生命周期。1.2 Bean工厂Bean工厂BeanFactory是Spring框架中负责创建和管理Bean的核心组件主要职责包括管理Bean的定义信息创建Bean实例管理Bean的生命周期处理Bean之间的依赖关系1.3 Bean定义BeanDefinition是描述Bean元数据信息的对象包含创建Bean所需的所有信息Bean的类型ClassBean的作用域单例、原型等Bean的初始化方法Bean的销毁方法Bean的依赖关系二、核心接口与类2.1 BeanFactory接口BeanFactory是Bean工厂的顶级接口定义了获取Bean的基本方法。public interface BeanFactory { Object getBean(String beanName) throws BeansException; Object getBean(String beanName, Object... args) throws BeansException; }2.2 BeanDefinition类BeanDefinition类定义了Bean的元数据信息。public class BeanDefinition { private Class beanClass; public BeanDefinition(Class beanClass) { this.beanClass beanClass; } public Class getBeanClass() { return beanClass; } public void setBeanClass(Class beanClass) { this.beanClass beanClass; } }2.3 BeansException类BeansException是Spring中处理Bean相关异常的基类。public class BeansException extends RuntimeException { public BeansException() { super(); } public BeansException(String message) { super(message); } public BeansException(String message, Throwable cause) { super(message, cause); } }三、实现类详解3.1 DefaultSingletonBeanRegistryDefaultSingletonBeanRegistry是SingletonBeanRegistry接口的默认实现使用HashMap存储单例Bean实例。public class DefaultSingletonBeanRegistry implements SingletonBeanRegistry { private MapString, Object singletonObjects new HashMap(); Override public void registerSingleton(String beanName, Object singleton) { singletonObjects.put(beanName, singleton); } Override public Object getSingleton(String beanName) { return singletonObjects.get(beanName); } }3.2 AbstractBeanFactoryAbstractBeanFactory是BeanFactory接口的抽象实现继承自DefaultSingletonBeanRegistry。它实现了Bean的获取逻辑管理单例Bean的缓存并定义了创建Bean的抽象方法。public abstract class AbstractBeanFactory extends DefaultSingletonBeanRegistry implements BeanFactory { Override public Object getBean(String beanName) throws BeansException { Object singleton getSingleton(beanName); if (singleton ! null) { return singleton; } BeanDefinition beanDefinition getBeanDefinition(beanName); return createBean(beanName, beanDefinition); } Override public Object getBean(String beanName, Object... args) throws BeansException { Object singleton getSingleton(beanName); if (singleton ! null) { return singleton; } BeanDefinition beanDefinition getBeanDefinition(beanName); return createBean(beanName, beanDefinition, args); } protected abstract BeanDefinition getBeanDefinition(String beanName) throws BeansException; protected abstract Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException; protected abstract Object createBean(String beanName, BeanDefinition beanDefinition, Object... args) throws BeansException; }3.3 AbstractAutowireCapableBeanFactoryAbstractAutowireCapableBeanFactory实现了创建Bean的具体逻辑使用InstantiationStrategy接口来创建Bean实例。public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory { private InstantiationStrategy instantiationStrategy new SimpleInstantiationStrategy(); Override protected Object createBean(String beanName, BeanDefinition beanDefinition) throws BeansException { return createBean(beanName, beanDefinition, null); } Override protected Object createBean(String beanName, BeanDefinition beanDefinition, Object... args) throws BeansException { Object bean null; try { bean createBeanInstance(beanDefinition, beanName, args); } catch (Exception e) { throw new BeansException(Instantiation of bean failed, e); } registerSingleton(beanName, bean); return bean; } protected Object createBeanInstance(BeanDefinition beanDefinition, String beanName, Object... args) throws BeansException { Constructor constructor null; Class? beanClass beanDefinition.getBeanClass(); Constructor?[] declaredConstructors beanClass.getDeclaredConstructors(); for (Constructor? ctor : declaredConstructors) { if (args ! null ctor.getParameterTypes().length args.length) { constructor ctor; break; } } return getInstantiationStrategy().instantiate(beanDefinition, beanName, constructor, args); } public InstantiationStrategy getInstantiationStrategy() { return instantiationStrategy; } public void setInstantiationStrategy(InstantiationStrategy instantiationStrategy) { this.instantiationStrategy instantiationStrategy; } }3.4 DefaultListableBeanFactoryDefaultListableBeanFactory是Spring Bean工厂的核心实现类实现了BeanDefinitionRegistry接口和继承了AbstractAutowireCapableBeanFactory。public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory implements BeanDefinitionRegistry { private MapString, BeanDefinition beanDefinitionMap new HashMap(); Override public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) { beanDefinitionMap.put(beanName, beanDefinition); } Override protected BeanDefinition getBeanDefinition(String beanName) throws BeansException { BeanDefinition beanDefinition beanDefinitionMap.get(beanName); if (beanDefinition null) { throw new BeansException(No bean named beanName is defined); } return beanDefinition; } }3.5 InstantiationStrategy接口及实现InstantiationStrategy接口定义了Bean实例化的策略有两个实现类SimpleInstantiationStrategy使用Java反射机制创建Bean实例。public class SimpleInstantiationStrategy implements InstantiationStrategy { Override public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) throws BeansException { Class? beanClass beanDefinition.getBeanClass(); try { if (ctor ! null) { return beanClass.getDeclaredConstructor(ctor.getParameterTypes()).newInstance(args); } else { return beanClass.getDeclaredConstructor().newInstance(); } } catch (Exception e) { throw new BeansException(Failed to instantiate [ beanClass.getName() ], e); } } }CglibInstantiationStrategy使用Cglib库创建Bean实例支持更复杂的场景。public class CglibInstantiationStrategy implements InstantiationStrategy { Override public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) throws BeansException { try { Enhancer enhancer new Enhancer(); enhancer.setSuperclass(beanDefinition.getBeanClass()); enhancer.setCallback(new NoOp() { Override public int hashCode() { return super.hashCode(); } }); if (ctor ! null) { return enhancer.create(ctor.getParameterTypes(), args); } else { return enhancer.create(); } } catch (Exception e) { throw new BeansException(Failed to instantiate [ beanDefinition.getBeanClass().getName() ], e); } } }四、类关系图4.1 继承关系BeanFactory ↑ AbstractBeanFactory ↑ AbstractAutowireCapableBeanFactory ↑ DefaultListableBeanFactory DefaultSingletonBeanRegistry ↑ AbstractBeanFactory4.2 实现关系DefaultListableBeanFactory implements BeanDefinitionRegistryDefaultSingletonBeanRegistry implements SingletonBeanRegistrySimpleInstantiationStrategy implements InstantiationStrategyCglibInstantiationStrategy implements InstantiationStrategy4.3 组合关系AbstractAutowireCapableBeanFactory组合了InstantiationStrategyDefaultListableBeanFactory组合了BeanDefinition的存储五、Bean生命周期5.1 生命周期阶段Bean定义阶段通过BeanDefinition描述Bean的元数据信息Bean注册阶段将BeanDefinition注册到BeanDefinitionRegistry中Bean实例化阶段根据BeanDefinition创建Bean实例Bean初始化阶段对Bean实例进行初始化如设置属性、处理依赖注入等Bean使用阶段Bean实例被应用程序使用Bean销毁阶段Bean实例被销毁单例Bean5.2 实例化策略使用无参构造函数如果Bean类有无参构造函数直接使用反射创建实例使用带参构造函数如果Bean类只有带参构造函数使用反射或Cglib创建实例使用工厂方法通过指定的工厂方法创建实例使用工厂Bean通过实现FactoryBean接口的Bean创建实例六、Bean作用域6.1 单例作用域SingletonSpring的默认作用域一个Bean定义在Spring容器中只会创建一个实例所有对该Bean的请求都会返回同一个实例。优点节省内存、提高性能、共享状态缺点线程安全问题、状态管理复杂6.2 原型作用域Prototype每次请求Bean时都会创建一个新的实例适用于需要频繁创建和销毁的对象。优点线程安全、状态隔离缺点内存消耗大、性能较低6.3 Web应用作用域Request每个HTTP请求创建一个新的Bean实例Session每个HTTP会话创建一个新的Bean实例GlobalSession每个全局HTTP会话创建一个新的Bean实例Portlet应用七、依赖注入7.1 构造函数注入通过Bean的构造函数来注入依赖关系。public class UserService { private final UserDao userDao; Autowired public UserService(UserDao userDao) { this.userDao userDao; } }优点确保Bean在创建时就拥有所有必要的依赖、避免了循环依赖、提高了代码的可读性和可测试性7.2 Setter方法注入通过Bean的Setter方法来注入依赖关系。public class UserService { private UserDao userDao; Autowired public void setUserDao(UserDao userDao) { this.userDao userDao; } }优点支持可选依赖、支持依赖的动态修改、简化了单元测试7.3 字段注入通过注解直接注入到Bean的字段中。public class UserService { Autowired private UserDao userDao; }优点代码简洁、减少了样板代码缺点破坏了封装性、使依赖关系不明确、难以进行单元测试八、自动装配8.1 自动装配模式no默认值不进行自动装配byName根据属性名称自动装配byType根据属性类型自动装配constructor根据构造函数参数类型自动装配autodetect自动检测使用constructor或byType模式8.2 优缺点优点减少手动配置的工作量、提高配置的可读性和可维护性、减少配置错误的可能性缺点依赖关系不够明确、可能导致意外的依赖注入、不支持复杂的依赖关系九、工作原理9.1 初始化阶段加载配置Spring容器加载配置文件或注解解析Bean定义注册Bean定义将解析后的Bean定义注册到BeanDefinitionRegistry中初始化单例Bean对于单例作用域的Bean在容器启动时就创建实例9.2 获取Bean阶段检查缓存首先检查单例缓存中是否存在Bean实例创建Bean如果缓存中不存在则创建Bean实例获取Bean定义实例化Bean初始化Bean缓存单例Bean返回Bean返回Bean实例给调用者9.3 销毁阶段关闭容器当应用程序关闭时关闭Spring容器销毁单例Bean调用单例Bean的销毁方法十、应用示例10.1 基本使用DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory(); BeanDefinition beanDefinition new BeanDefinition(UserService.class); beanFactory.registerBeanDefinition(userService, beanDefinition); UserService userService (UserService) beanFactory.getBean(userService); userService.queryUserInfo();10.2 带参数的构造函数DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory(); BeanDefinition beanDefinition new BeanDefinition(UserServiceWithConstructor.class); beanFactory.registerBeanDefinition(userServiceWithConstructor, beanDefinition); UserServiceWithConstructor userService (UserServiceWithConstructor) beanFactory.getBean(userServiceWithConstructor, test, 25); userService.queryUserInfo();10.3 使用不同的实例化策略DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory(); ((AbstractAutowireCapableBeanFactory) beanFactory).setInstantiationStrategy(new CglibInstantiationStrategy()); BeanDefinition beanDefinition new BeanDefinition(UserServiceWithConstructor.class); beanFactory.registerBeanDefinition(userServiceWithConstructor, beanDefinition); UserServiceWithConstructor userService (UserServiceWithConstructor) beanFactory.getBean(userServiceWithConstructor, test, 25); userService.queryUserInfo();十一、扩展点11.1 自定义BeanPostProcessor允许在Bean初始化前后对Bean进行处理。public class MyBeanPostProcessor implements BeanPostProcessor { Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println(Before initialization: beanName); return bean; } Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println(After initialization: beanName); return bean; } }11.2 自定义FactoryBean允许自定义Bean的创建过程。public class MyFactoryBean implements FactoryBeanUserService { Override public UserService getObject() throws Exception { return new UserService(); } Override public Class? getObjectType() { return UserService.class; } Override public boolean isSingleton() { return true; } }11.3 自定义InstantiationStrategy允许自定义Bean的实例化策略。public class MyInstantiationStrategy implements InstantiationStrategy { Override public Object instantiate(BeanDefinition beanDefinition, String beanName, Constructor ctor, Object[] args) throws BeansException { System.out.println(Instantiating bean: beanName); Class? beanClass beanDefinition.getBeanClass(); try { if (ctor ! null) { return beanClass.getDeclaredConstructor(ctor.getParameterTypes()).newInstance(args); } else { return beanClass.getDeclaredConstructor().newInstance(); } } catch (Exception e) { throw new BeansException(Failed to instantiate [ beanClass.getName() ], e); } } }十二、最佳实践12.1 使用注解配置注解配置更加简洁、直观。Component public class UserService { } Configuration ComponentScan(com.example) public class AppConfig { }12.2 合理使用作用域对于无状态的Bean使用单例作用域对于有状态的Bean使用原型作用域对于Web应用根据需要使用request、session等作用域12.3 避免循环依赖循环依赖是指两个或多个Bean之间相互依赖Spring可以处理构造函数注入以外的循环依赖但最好避免。12.4 使用构造函数注入构造函数注入是Spring推荐的依赖注入方式它可以确保Bean在创建时就拥有所有必要的依赖。12.5 使用Qualifier注解当存在多个同类型的Bean时使用Qualifier注解指定要注入的Bean名称。Component public class UserService { private final UserDao userDao; Autowired public UserService(Qualifier(userDaoImpl) UserDao userDao) { this.userDao userDao; } }12.6 使用Value注解使用Value注解注入配置值提高配置的灵活性。Component public class UserService { Value(${user.service.name}) private String name; }十三、常见问题与解决方案13.1 NoSuchBeanDefinitionException原因找不到指定名称的Bean定义解决方案检查Bean名称是否正确、检查Bean是否已注册、检查配置是否正确13.2 BeanCreationException原因Bean创建失败解决方案检查Bean的构造函数是否正确、检查Bean的依赖是否存在、检查Bean的初始化方法是否正确13.3 UnsatisfiedDependencyException原因依赖注入失败解决方案检查依赖的Bean是否存在、检查依赖的类型是否匹配、检查自动装配的配置是否正确13.4 CircularDependencyException原因循环依赖解决方案重构代码消除循环依赖、使用Setter方法注入代替构造函数注入、使用Lazy注解延迟加载13.5 NoClassDefFoundError原因找不到类定义解决方案检查依赖是否正确、检查类路径是否正确、检查版本是否兼容13.6 IllegalArgumentException原因参数非法解决方案检查方法参数是否正确、检查配置值是否正确、检查Bean定义是否正确十四、总结Spring Bean工厂是Spring框架的核心组件它通过管理Bean的定义、创建和生命周期为应用程序提供了一种灵活、可配置的对象管理机制。核心优势灵活性支持多种配置方式和实例化策略可扩展性提供了丰富的扩展点可靠性成熟稳定的实现易用性简洁直观的API通过理解Spring Bean工厂的原理和类与类之间的关系开发者可以更好地掌握Spring框架的工作机制构建高质量的应用程序。作为开发者我们应该不断学习和掌握Spring框架的新特性和最佳实践以提高开发效率和代码质量。