接口和实现类
public interface IUserService {
public void doSome();
}
public class UserServiceImpl implements IUserService {
public UserServiceImpl(){
System.out.println("–被实例化了–");
}
@Override
public void doSome() {
System.out.println(“UserServiceImpl 。。。 被执行了”);
}
}
自定义FactoryBean
public class MyFactoryBean implements FactoryBean{
@Override
public IUserService getObject() throws Exception {
System.out.println("–IUserService实例化之前—");
IUserService service = new UserServiceImpl();
System.out.println("–IUserService实例化后—");
return service;
}
@Override
public Class> getObjectType() {
return IUserService.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
配置文件
**《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》** > > **【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享** 0" encoding="UTF-8"?>xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 测试–通过类型获取 @Test public void test1() { BeanFactory bf = new XmlBeanFactory(new ClassPathResource(“applicationContext.xml”)); Object bean = bf.getBean(IUserService.class); System.out.println(bean); } 输出结果 –IUserService实例化之前— –被实例化了– –IUserService实例化后— com.dpb.service.UserServiceImpl@5315b42e 测试–通过id获取 @Test public void test1() { BeanFactory bf = new XmlBeanFactory(new ClassPathResource(“applicationContext.xml”)); Object bean = bf.getBean(“myFactoryBean”); System.out.println(bean); } 输出结果 –IUserService实例化之前— –被实例化了– –IUserService实例化后— com.dpb.service.UserServiceImpl@783e6358 如果想要获取FactoryBean对象 id前加 &就可以 @Test public void test1() { BeanFactory bf = new XmlBeanFactory(new ClassPathResource(“applicationContext.xml”)); Object bean = bf.getBean("&myFactoryBean"); System.out.println(bean); } 输出结果 com.dpb.factorybean.MyFactoryBean@3b81a1bc 2.增强实现 通过FactoryBean创建一个代理类来增强目标类,我们来看下效果 接口和实现类 public interface IUserService { public void doSome(); } public class UserServiceImpl implements IUserService { public UserServiceImpl(){ System.out.println("–被实例化了–"); } @Override public void doSome() { System.out.println(“UserServiceImpl 。。。 被执行了”); } } 自定义FactoryBean public class MyFactoryBean implements FactoryBean,InitializingBean,DisposableBean{ private Object proxyObject; private Object target; private String interfaceName; @Override public Object getObject() throws Exception { return proxyObject; } @Override public Class> getObjectType() { return proxyObject.getClass()==null?Object.class:proxyObject.getClass(); } @Override public boolean isSingleton() { return true; } @Override public void destroy() throws Exception { System.out.println(“destroy …”); } @Override public void afterPropertiesSet() throws Exception { System.out.println("—afterPropertiesSet—"); proxyObject = Proxy.newProxyInstance( this.getClass().getClassLoader() , new Class[]{Class.forName(interfaceName)} , new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("----代理方法执行开始----"); Object obj = method.invoke(target, args); System.out.println("----代理方法执行结束----"); return obj; } }); } public String getInterfaceName() { return interfaceName; } public void setInterfaceName(String interfaceName) { this.interfaceName = interfaceName; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } } 配置文件 xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 测试 @Test public void test1() { ApplicationContext ac = new ClassPathXmlApplicationContext(“applicationContext.xml”); IUserService bean = (IUserService) ac.getBean(“myFactoryBean”); System.out.println("****************"); bean.doSome(); System.out.println(); } 输出结果: –被实例化了– —afterPropertiesSet— ----代理方法执行开始---- UserServiceImpl 。。。 被执行了 ----代理方法执行结束---- 小结:通过输出结果我们可以看到通过FactoryBean接口我们也可以实现BeanFactory中某些接口提供的功能,而且会更加的灵活一些。 3.FactoryBean的实际使用案例 Spring在整合mybatis框架的时候提供的SqlSessionFactoryBean就是FactoryBean的很好的实现。 id=“sqlSessionFactoryBean” > Spring会调用SqlSessionFactoryBean这个实现了FactoryBean的工厂Bean 同时加载dataSource,Mapper文件的路径,对sqlSessionFactory进行初始化。 源代码比较多就不一一贴出来。到了这儿可以自行跟踪下源代码。 核心方法 @Override public void afterPropertiesSet() throws Exception { // 省略 this.sqlSessionFactory = buildSqlSessionFactory(); } protected SqlSessionFactory buildSqlSessionFactory() throws IOException { Configuration configuration;



