Spring 生成 bean 的四种方式

Spring四种方式来管理bean的生成

第一种 构造方法

使用spring的xml配置文件调用构造方法来生成bean

id为唯一标识

class为要生成的类全限定类名

scope是这个类的范围

singleton单例模式

prototype多例模式

request作用在单个请求中

session作用在一次会话中

property为这个类的属性

name是这个属性的名字

value是这个属性的值

ref是这个属性的引用,如果这个属性是其他类,可以用其他类的id

第二种 静态工厂

使用静态工厂方式生成实例

这种方式需要建一个工厂类,在其中写一个创建bean实例的方法

和第一种使用构造方法方式生成bean不同,静态工厂的class是指定静态工厂的全限定类名,并且需要额外指定一个工厂方法,这个工厂方法就是创建bean实例的工厂方法

public class ProxyFactoryBean {
public static TestProxyService createProxy(){
return new TestProxyServiceImpl();
}

public TestProxyServiceImpl createBean(){
TestProxyServiceImpl testProxyService = new TestProxyServiceImpl();
return testProxyService;
}
}

使用静态工厂的好处是,可以在创建方法之前或者之后处理一些前置的校验或者配置或其他处理

第三种 实例工厂

第三种使用实例工厂实例化bean,那么首先要先实例化工厂类

在xml中需要配置两个bean,一个是实例化工厂,一个是通过实例工厂实例化的类

在实例化所需要的bean中,class可以不用配置,配上也无用

factory-bean指的是已经实例化的工厂实例id

factory-method指的是实例工厂中的创建实例类的

第四种 实例工厂衍生方案

第三种配置工厂实例略显冗余,可以将工厂实例类实现FactoryBean<>接口,并重写getObject和getObjectType方法

配置中只需配置一个bean,且无需配置工厂方法

public class ProxyFactoryBean implements FactoryBean {
private String name;

public ProxyFactoryBean(String name) {
this.name = name;
}

public ProxyFactoryBean() {
}

public void setName(String name) {
this.name = name;
}

@Override
public TestProxyServiceImpl getObject() throws Exception {
System.out.println("开始创建。。。。");
TestProxyServiceImpl testProxyService = new TestProxyServiceImpl();
testProxyService.setName(this.name);
System.out.println("创建结束");
return testProxyService;
}

@Override
public Class<?> getObjectType() {
return TestProxyServiceImpl.class;
}
}

xml配置

note:第一种方式常用,第四种运用最广泛,最重要