Spring涉及到的设计模式
- 简单工厂模式
- 工厂模式
- 单例模式
- 适配器
- 装饰器模式 Decortor
- 代理模式
- 观察者模式
- 策略模式
- 模板模式
- 简单工厂模式
- 一个工厂类根据传入的参数,动态决定创建哪一个类
public abstract class AbstractBeanFactory extends ***{
//根据传入的名字 创建某个类
@Override
public Object getBean(String name,……) throws BeansException {
// doGetBean才是真正向IoC容器获取被管理Bean的过程
return doGetBean(name, null, null, false);
}
}
}
- 工厂模式
- 将对象的创建及初始化交给工厂对象
public abstract class AbstractAutowireCapableBeanFactory(){
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) {
// 1.利用工厂模式进行实例化
if (mbd.getFactoryMethodName() != null) {
return instantiateUsingFactoryMethod(beanName, mbd, args);
}
根据不同的条件进行实例化
}
- 单例模式
- 适配器
- aop中生成代理对象前,设置拦截器,通过拦截器中的内容增强了代理方法的功能。
Adapter类接口:Target
public interface AdvisorAdapter {
boolean supportsAdvice(Advice advice);
MethodInterceptor getInterceptor(Advisor advisor);
}
MethodBeforeAdviceAdapter类,Adapter
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {
public boolean supportsAdvice(Advice advice) {
return (advice instanceof MethodBeforeAdvice);
}
public MethodInterceptor getInterceptor(Advisor advisor) {
MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
return new MethodBeforeAdviceInterceptor(advice);
}
}
- 装饰器模式 Decortor
- 代理模式
Spring AOP 利用了 AspectJ AOP实现的! AspectJ AOP 的底层用了动态代理
动态代理有两种
目标方法有接口时候自动选用 JDK 动态代理
目标方法没有接口时候选择 CGLib 动态代理
- 观察者模式
定义对象间的一对多的依赖关系,当一个对象状态发生变化时,所有依赖他的对象都会被通知并更新
spring中Observer模式常用的地方是listener的实现。如ApplicationListener。 - 策略模式
ApplicationContex接口实现有ClassPathXmlApplicationContext和FileSystemXmlApplicationContext类
根据beans.xml的文件路径来选择使用哪一个实现方法
--ClassPathXmlApplicationContext:从类的路径下加载配置文件
--FileSystemXmlApplicationContext:从文件系统路径下加载文件
- 模板模式:定义一个操作中算法的框架,实现延伸到子类
spring中的jdbcTemplate中excute
Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式吧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)