FactoryBean 是Spring框架中的一个接口,有三个方法,精简源码如下:
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
看一个例子:
1、定义一个Tool类
public class Tool {
private int id;
public Tool(int id) {
this.id = id;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
2、新建一个ToolFactory,实现FactoryBean接口
import org.springframework.beans.factory.FactoryBean;
public class ToolFactory implements FactoryBean<Tool>{
private int factoryId;
private int toolId;
@Override
public Tool getObject() throws Exception {
return new Tool(toolId);
}
@Override
public Class<?> getObjectType() {
return Tool.class;
}
@Override
public boolean isSingleton() {
return false;
}
public int getFactoryId() {
return factoryId;
}
public void setFactoryId(int factoryId) {
this.factoryId = factoryId;
}
public int getToolId() {
return toolId;
}
public void setToolId(int toolId) {
this.toolId = toolId;
}
}
3、在spring.xml中注册
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">
<bean id="tool" class="com.xiaofeng.authe.factorybean.ToolFactory">
<property name="factoryId" value="9090"></property>
<property name="toolId" value="1"></property>
</bean>
</beans>
注:这个例子中的ToolFactory是创建在com.xiaofeng.authe.factorybean包下
4、写一个测试类:FactoryBeanXmlConfigTest
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring.xml"})
public class FactoryBeanXmlConfigTest {
@Resource(name ="tool")
private Tool tool;
@Resource(name = "&tool")
private ToolFactory toolFactory;
@Test
public void testConstructWorkerByXml(){
System.out.println(1 == tool.getId() ? "is tool" : "is not tool");
}
@Test
public void testConstructWorkerFactoryByXml(){
System.out.println(9090 == toolFactory.getFactoryId() ? "is toolFactory" : "is not toolFactory");
}
}
注:这个例子引用spring-test maven信息:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.0.5.RELEASE</version>
<scope>test</scope>
</dependency>
分别运行上面的两个test:
总结:获取FactoryBean本身,名字需要加上"&"。个人想法是,这个ToolFactory就是一个代理,和其他代理不同的是,实现了FactoryBean接口,以便被spring容器管理。
例子参考:https://www.baeldung.com/spring-factorybean 作者:baeldung