1. 简单工厂模式
- 实现:
BeanFactory
接口
如图,BeanFactory是Spring中最底层的接口之一,它提供了Spring IoC的最底层设计:
其中getBean
方法实现了简单工厂模式:将参数传递给工厂类,动态决定应该创建哪一个产品类。通过getBean(bean.class)
获得对应的bean实例。 - 原理:
- Bean容器启动阶段:
- 读取Bean的XML文件,将bean元素转换为BeanDefinition对象。
- 然后通过BeanDefinitionRegistry将这些bean注册到BeanFactory中,将它们保存在一个ConcurrentHashMap中。
- 容器中bean的实例化阶段,主要是通过反射、cglib对bean进行实例化。
- Bean容器启动阶段:
2. 工厂方法
- 实现:
FactoryBean
接口
- 特点:实现了FactoryBean接口的bean是一类叫做factory的bean。
spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,因此返回的不是factory这个bean,而是这个bean.getOjbect()方法的返回值。 - 例子:
- 典型的例子就是Spring与Mybatis结合,
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> // ... </bean>
- SqlSessionFactoryBean解析:
// getObject返回了一个SqlSessionFactory实例 public SqlSessionFactory getObject() throws Exception { if (this.sqlSessionFactory == null) { this.afterPropertiesSet(); } return this.sqlSessionFactory; } // 并且当this.sqlSessionFactory为null时,会进行断言检验,然后创建一个SqlSessionFactory实例 public void afterPropertiesSet() throws Exception { Assert.notNull(this.dataSource, "Property 'dataSource' is required"); Assert.notNull(this.sqlSessionFactoryBuilder, "Property 'sqlSessionFactoryBuilder' is required"); Assert.state(this.configuration == null && this.configLocation == null || this.configuration == null || this.configLocation == null, "Property 'configuration' and 'configLocation' can not specified with together"); this.sqlSessionFactory = this.buildSqlSessionFactory(); }
- 典型的例子就是Spring与Mybatis结合,
3. 代理模式
- 实现:Spring AOP的底层原理就是通过代理模式实现的。
- 静态代理:代理类实现与目标对象相同的接口,并在内部维护一个代理对象。
- 动态代理:动态的在内存中构建代理对象(需要我们制定要代理的目标对象实现的接口类型),利用JDK的API生成指定接口的对象,也称为JDK代理。
- cglib代理:通过引入cglib的jar包,实现MethodInterceptor接口,实现代理。
未完待续