首先要分辨BeanFactory 与 FactoryBean的区别, 两个名字很像,所以容易搞混
BeanFactory: 以Factory结尾,表示它是一个工厂类,是用于管理Bean的一个工厂
FactoryBean:以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean
Spring中的Bean有两种。
一种是普通的bean ,比如配置
那个使用BeanFactory根据id personService获取bean的时候,得到的对象就是PersonServiceImpl类型的。
另外一种就是实现了org.springframework.beans.factory.FactoryBean
以Spring提供的ProxyFactoryBean为例子,配置如下:
com.spring.service.PersonService
logInteceptor
ZFMethodAdvice
@Test
public void test01() {
PersonService ps = context.getBean("personServiceByLog", PersonService.class);
ps.sayHello();
String name = ps.getName();
System.out.println(name);
}
@Test
public void test04() {
ProxyFactoryBean factoryBean = context.getBean("&personServiceByLog", ProxyFactoryBean.class);
PersonService ps = (PersonService) factoryBean.getObject();
String name = ps.getName();
System.out.println(name);
}
自己实现一个FactoryBean, 功能:用来代理一个对象,对该对象的所有方法做一个拦截,在方法调用前后都输出一行log
package com.spring.factorybean;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
public class ZFFactoryBean implements FactoryBean
首先这样定义bean
然后获取Bean,并测试。
@Test
public void test06() {
PersonService ps = context.getBean("zfPersonService", PersonService.class);
ps.sayHello();
String name = ps.getName();
System.out.println(name);
}
上面的ZFBeanFactory只是模仿了ProxyFactoryBean的功能做了一个实现而已。
其实通过FactoryBean这种特点,可以实现很多有用的功能 。。。