很多情况下使用<bean id=”bean1” class=”…” />定义一个bean,这种定义方式Spring将会调用默认的无参数构造方法创建Bean实例。除此之外还可以使用工厂方式创建Bean实例,实现Bean创建与使用的分离,将Bean创建工作交由工厂来完成。
配置工厂Bean的三种方式。
抽象接口:
public interface IMusicBox {
public void play();
}
1、静态工厂方法取得Bean实例
工厂类:
public class MusicBoxFactory {
public static IMusicBox createMusicBox(){
return new IMusicBox(){
public void play(){
System.out.println("Play piano...");
}
};
}
}
配置文件:
<bean id="musicBox" class="test.spring.MusicBoxFactory" factory-method="createMusicBox" />
测试类:
public static void main(String[] args) {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("bean-config.xml");
IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");
musicbox.play();
}
2、工厂实例的方法取得Bean实例
工厂类:
public class MusicBoxFactory {
public IMusicBox createMusicBox(){//没有static修饰
return new IMusicBox(){
public void play(){
System.out.println("Play piano...");
}
};
}
}
配置文件:
<bean id="factoryBean" class="test.spring.MusicBoxFactory" />
<bean id="musicBox" factory-bean="factoryBean" factory-method="createMusicBox" />
“factory-bean”属性指定工厂Bean,”factory-method”属性指定工厂方法来取得Bean实例。
测试类:
public static void main(String[] args) {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("bean-config.xml");
IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");
musicbox.play();
}
3、工厂类实现org.springframework.beans.factory.FacotryBean接口
工厂类:
import org.springframework.beans.factory.FactoryBean;
public class MusicBoxFactory2 implements FactoryBean {
public Object getObject() throws Exception {
return new IMusicBox(){
public void play(){
System.out.println("Play piano...");
}
};
}
public Class getObjectType() {
return IMusicBox.class;
}
public boolean isSingleton() {
return false;
}
}
配置文件:
<bean id="musicBox" class="test.spring.MusicBoxFactory2"/>
测试类:
public static void main(String[] args) {
ApplicationContext ctx =
new ClassPathXmlApplicationContext("bean-config.xml");
//不加 & 返回工厂的“产品”
IMusicBox musicbox = (IMusicBox)ctx.getBean("musicBox");
musicbox.play();
//加 & 返回工厂类实例
Object obj = ctx.getBean("&musicBox");
System.out.println(obj.getClass().getName());
}
实现FactoryBean接口的类不会被视为普通的Bean,Spring会自动检测,调用getObject方法获取Bean实例
分享到:
相关推荐
Spring框架中提供了多种方式来创建bean实例,包括通过构造器、静态工厂方法和实例工厂方法等。这种方式可以让开发者更好地控制bean的创建过程,实现更多的自定义需求。 通过构造器方式创建bean实例 在Spring中,...
本篇将深入探讨如何自定义注解并模拟Spring通过注解方式创建bean实例。 首先,了解注解(Annotation)在Java中的角色。注解是一种元数据,它提供了在源代码中添加信息的方式,这些信息可以被编译器或运行时环境读取...
4. **启动后处理器(BeanPostProcessor)**:这些是特殊类型的Bean,它们在所有常规Bean实例化之后,但初始化之前进行处理。它们的实例化顺序由`@Order`注解决定,或者通过实现`Ordered`接口来控制。 5. **...
本篇文章将深入探讨Spring项目中Bean的实例化过程,包括三种主要的bean实例化方式:构造方法、静态工厂和实例工厂。 首先,让我们了解什么是Bean。在Spring中,Bean是应用程序中的业务对象,它们由Spring容器负责...
这种方式特别适合于那些具有多个必填依赖项的情况,因为构造器可以确保这些依赖项在Bean实例创建时就被正确地设置。为了支持构造器注入,Bean类必须至少有一个构造器,这个构造器可以是无参的,也可以是带有参数的。...
在`doCreateBean()`方法中,Spring会创建Bean的实例,`createBeanInstance(beanName, mbd, args)`执行Bean实例的创建,而`populateBean(beanName, mbd, instanceWrapper)`则负责填充Bean的属性,将依赖注入到Bean中...
在Java代码中,使用`ClassPathXmlApplicationContext`加载XML配置文件,并通过Bean的ID获取并使用Bean实例。 ```java ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); MyService ...
4. **静态工厂方法或Singleton作用域**:如果使用静态工厂方法创建Bean,且未正确配置单例模式,那么每次请求都会创建新的Bean实例。对于Singleton作用域的Bean,Spring保证在整个容器生命周期内只有一个实例,如果...
(1)bean的创建默认就是框架利用反射new出来的bean实例; (2)工厂模式:工厂帮我们创建对象,有一个专门帮我们创建对象的类,这个类就是工厂。 如:AirPlane ap = AirPlaneFactory.getAirPlane(String jzName); ...
- **静态工厂方法**则更简洁,无需创建工厂实例,适合简单的对象创建。 5. **总结** 实例化Spring Bean的工厂方法是实现定制化对象创建的一种方式,提供了比直接声明Bean更高的灵活性。开发者可以根据需求选择...
总的来说,JavaEE Spring中的静态工厂创建实例是一种高级的DI实现方式,它提供了更多的灵活性和控制力,但同时也增加了代码的复杂性。理解并合理运用静态工厂方法,可以帮助我们更好地设计和组织应用程序的架构。在...
本文将详细介绍Spring中的三种主要的Bean实例化方式:XML配置、注解配置以及Java配置。 ### 1. XML配置 XML配置是Spring早期版本中最常见的Bean定义方式。在`spring_first`目录下的配置文件(如`beans.xml`)中,...
本文将详细探讨Spring中bean实例化的三种主要方式:普通构造方法创建、静态工厂创建和实例工厂创建。 1. 普通构造方法创建: 这是最常见、最直观的方式,适用于大部分情况。在Spring配置文件中,我们通过`<bean>`...
在Spring框架中,Bean的创建方式多样,其中两种常见的非XML配置方式是通过静态工厂方法和实例工厂方法来创建Bean。这些方法为Spring容器提供了更灵活的Bean实例化策略,让我们深入了解一下这两种方法。 首先,静态...
·调用实例工厂方法创建bean 时,必须将实例工厂配置成bean 实例。 而静态工厂方法则无须配置工厂bean。 ·调用实例工厂方法创建bean 时,必须使用factory-bean 属性来确定工厂bean。 而静态工厂方法则使用...
在Spring框架中,实例工厂是一种创建对象的方式,它允许我们自定义对象的创建逻辑,而非依赖于Spring容器默认的构造函数实例化。这种方式对于那些需要特殊初始化步骤或者有复杂生命周期的对象特别有用。 Spring支持...
通过阅读Spring框架的源代码,我们可以看到FactoryBean接口的实现如何影响IoC容器的行为,以及`getObject()`和`isSingleton()`方法如何被容器调用来生成和管理Bean实例。 至于"工具"标签,FactoryBean也是Spring...
- 初始化:Spring容器在创建Bean实例时,会执行初始化过程,包括实例化、属性设置(通过setter方法或构造函数注入)、初始化回调(如`InitializingBean`接口的`afterPropertiesSet()`方法或`@PostConstruct`注解的...
开发者可以通过实现这个接口并在配置中注册,从而在Bean实例化之后、初始化之前或初始化之后进行定制操作。这种方式更加灵活,可以覆盖更多的Bean生命周期阶段。 ```java public class CustomBeanPostProcessor ...
总结,Spring的实例工厂方法注入是一种高级的依赖注入方式,它可以让你在不直接修改bean定义的情况下,通过外部工厂方法控制bean的实例化。这在实际开发中,特别是对于那些需要动态行为或者复杂初始化逻辑的对象,是...