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() { return null; }
public boolean isSingleton() { return false;
} }
|
以 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); } }
|
细节
- 对于 FactoryBean 实现,就想获得注解类
1
| <bean id="conn" class="com.rhino.MysqlFactoryBean"/>
|
对于上面的注解,如果 MysqlFactoryBean
实现了 FactoryBean
,并且,ctx
我就想获得 MysqlFactoryBean
,而不是内部的 getObject
的话,只需要
ctx.getBean("&conn")
在变量前面加上 &