
1. Spring对象实例化基础认知在Spring框架中对象实例化是IoC容器的核心功能之一。通过XML配置方式管理Bean的生命周期是Spring最经典也是最稳定的配置方式。与注解配置相比XML配置具有更清晰的层次结构和更强的可维护性特别适合中大型项目。XML配置方式主要通过bean标签定义对象Spring容器会根据配置信息完成对象的创建和依赖注入。这种声明式编程方式将对象的创建逻辑从代码中解耦出来使得应用程序更加灵活。注意虽然现在Spring Boot默认推荐使用JavaConfig和注解配置但XML配置在企业级遗留系统和需要动态修改配置的场景中仍有不可替代的价值。2. 构造器实例化方式2.1 基本构造器注入这是最常用的实例化方式Spring通过调用类的无参构造器创建对象bean iduserService classcom.example.UserServiceImpl/当Spring容器启动时会通过反射机制加载com.example.UserServiceImpl类调用其无参构造器将实例化后的对象放入IoC容器中2.2 带参数构造器注入当需要传入构造参数时可以使用constructor-arg标签bean iddataSource classcom.example.BasicDataSource constructor-arg valuecom.mysql.jdbc.Driver/ constructor-arg valuejdbc:mysql://localhost:3306/test/ constructor-arg valueroot/ constructor-arg valuepassword/ /bean参数传递规则value属性用于基本类型和Stringref属性用于引用其他Beantype属性可指定参数类型避免歧义index属性可指定参数位置从0开始实际经验当构造参数超过3个时建议考虑使用setter注入或Builder模式以提高可读性。3. 静态工厂方法实例化3.1 基础静态工厂当对象创建逻辑比较复杂时可以使用静态工厂方法bean idcalendar classjava.util.Calendar factory-methodgetInstance/关键属性class包含静态工厂方法的类factory-method静态方法名称3.2 带参数静态工厂工厂方法也可以接收参数bean idnumberFormat classjava.text.NumberFormat factory-methodgetCurrencyInstance constructor-arg valuezh_CN/ /bean典型应用场景JDK内置类的实例化如Calendar、NumberFormat第三方库的工厂类需要复杂初始化逻辑的对象4. 实例工厂方法实例化4.1 基本实例工厂当工厂方法不是静态时需要先配置工厂Bean!-- 先配置工厂Bean -- bean idserviceFactory classcom.example.ServiceFactory/ !-- 通过工厂Bean创建目标对象 -- bean idorderService factory-beanserviceFactory factory-methodcreateOrderService/4.2 带参数实例工厂工厂方法可以接收参数bean idpaymentService factory-beanserviceFactory factory-methodcreatePaymentService constructor-arg valueALIPAY/ /bean这种方式的优势工厂类本身可以由Spring管理可以注入其他依赖可以实现更复杂的对象创建逻辑适合需要根据不同条件创建不同实现的场景5. FactoryBean接口实现5.1 自定义FactoryBean实现FactoryBean接口可以创建更灵活的工厂public class MyFactoryBean implements FactoryBeanMyObject { Override public MyObject getObject() throws Exception { // 复杂的对象创建逻辑 return new MyObject(); } Override public Class? getObjectType() { return MyObject.class; } Override public boolean isSingleton() { return true; } }XML配置bean idmyObject classcom.example.MyFactoryBean/5.2 FactoryBean的高级特性延迟初始化通过lazy-init控制生命周期回调可以实现InitializingBean等接口作用域控制通过scope属性配置Spring内置的FactoryBean示例ListFactoryBeanMapFactoryBeanPropertiesFactoryBean6. 对象生命周期控制6.1 初始化与销毁方法bean iddataSource classcom.example.BasicDataSource init-methodinit destroy-methodclose property namedriverClassName valuecom.mysql.jdbc.Driver/ /bean6.2 生命周期接口实现Bean可以实现以下接口InitializingBean替代init-methodDisposableBean替代destroy-method6.3 Bean作用域bean iduser classcom.example.User scopeprototype/常用作用域singleton默认值单例prototype每次获取新实例requestWeb请求作用域sessionWeb会话作用域7. 高级实例化技巧7.1 继承配置bean idbaseService abstracttrue property nametimeout value1000/ /bean bean iduserService classcom.example.UserService parentbaseService/7.2 依赖检查bean idclient classcom.example.Client dependency-checkobjects property nameservice refuserService/ /bean检查模式none不检查默认simple检查基本类型objects检查对象引用all检查所有依赖7.3 自动装配bean iduserController classcom.example.UserController autowirebyType/自动装配模式no不自动装配默认byName按属性名装配byType按属性类型装配constructor构造器参数装配8. 实战问题排查8.1 常见配置错误ClassNotFoundException检查class属性值是否正确确认类在classpath中NoSuchMethodError构造器参数不匹配工厂方法不存在BeanCurrentlyInCreationException循环依赖问题使用depends-on解决8.2 性能优化建议合理使用作用域无状态Bean使用singleton有状态Bean使用prototype延迟初始化bean idheavyBean class... lazy-inittrue/使用depends-on优化初始化顺序8.3 XML配置最佳实践模块化配置import resourceservice-context.xml/使用p命名空间简化配置bean iduser classcom.example.User p:nameJohn p:age30/配置profilebeans profiledev bean iddataSource class... !-- 开发环境配置 -- /bean /beans在实际项目中我通常会为不同类型的Bean创建独立的XML配置文件如dao-context.xml、service-context.xml等然后通过import组合使用。对于复杂的依赖关系使用depends-on明确声明初始化顺序可以避免很多难以排查的问题。