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); } 根据不同的条件进行实例化 }
- 将对象的创建及初始化交给工厂对象
- 单例模式
- 比如在创建bean的时候。
- 适配器
- 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); } }
- aop中生成代理对象前,设置拦截器,通过拦截器中的内容增强了代理方法的功能。
- 装饰器模式 Decortor
- 我们的项目需要访问不同的数据库。如何动态的切换不同的数据源呢
spring用到的包装器模式在类名上有两种表现,一种含有 Wrapper 另一种 Decorator
基本上都是动态的给一个对象添加些额外的职责一种是 applicationContext中配置所有的dataSource 可能是不同类型的,比如不同的数据库
二是 org.springframework.jndi.JndiObjectFactoryBean sessionFactory根据用户的每次请求,将dataSource设成不同的数据源
- 我们的项目需要访问不同的数据库。如何动态的切换不同的数据源呢
- 代理模式
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不需要继承的另一种实现方式吧。