0%

spring | FactoryBean

  • FactoryBean 接口
  • 实例工厂
  • 静态工厂

FactoryBean 接口

  • 实现 FactoryBean 接口
  • Spring 配置文件的配置

3 个需要重写的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@Data
class UserFactoryBean implements FactoryBean {
private Person person;

public Object getObject() throws Exception {
// 用于书写创建复杂对象的代码 把复杂对象作为方法的返回值返回
return null;
}

public Class<?> getObjectType() {
// 返回 所创建复杂对象的 class 对象
return null;
}

public boolean isSingleton() {
return false; // 每次调用都需要创建一个新的复杂对象
// return true; // 只创建一个这种类型的复杂对象
}
}

mysql 为例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.rhino;

import lombok.Data;
import org.springframework.beans.factory.FactoryBean;

import java.sql.Connection;
import java.sql.DriverManager;

@Data
class MysqlFactoryBean implements FactoryBean<Connection> {

public Connection getObject() throws Exception {
// 用于书写创建复杂对象的代码 把复杂对象作为方法的返回值返回
Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/sun", "root", "root");
return connection;
}

public Class<?> getObjectType() {
// 返回 所创建复杂对象的 class 对象
return Connection.class;
}

public boolean isSingleton() {
return true; // 只创建一个这种类型的复杂对象
}
}

spring 文件配置为

<bean id="conn" class="com.rhino.MysqlFactoryBean"/>

相关的配置参考

ps: 对于简单对象

<bean id="user" class="com.rhino.User">

使用

1
2
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
User user = (Person) ctx.getBean("user");

user 是获取 User 这个类的对象。

但是,如果 user 实现了 FactoryBean 接口,则获取的是它所创建的复杂对象 User,而不是 MysqlFactoryBean

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.sql.Connection;

public class TestFunction {

@Test
public void test() {
ApplicationContext ctx = new ClassPathXmlApplicationContext("/applicationContext.xml");
Connection connection = (Connection) ctx.getBean("conn");
System.out.println(connection);
}
}

细节

  1. 对于 FactoryBean 实现,就想获得注解类
1
<bean id="conn" class="com.rhino.MysqlFactoryBean"/>

对于上面的注解,如果 MysqlFactoryBean 实现了 FactoryBean,并且,ctx 我就想获得 MysqlFactoryBean,而不是内部的 getObject 的话,只需要

ctx.getBean("&conn")

在变量前面加上 &

请我喝杯咖啡吧~