获取网站域名/给公司做网站要多少钱
深入解析spring中用到的九种设计模式
第一种:单例模式
spring容器中的bean默认是单例的,一般情况下用户不会自己创建Bean,而是交给容器去管理,spring不是通过私有化构造函数进行的单例模式控制。Spring框架对单例的支持是采用单例注册表的方式进行实现的。
第二种:简单工厂
简单又叫做静态工厂方法(StaticFactory Method)模式,
传入对应的类型就可构建对应的对象
第三种:工厂方法
spring常用的创建方式有以下四种:
-
setter 方法
-
构造函数
-
静态工厂
-
实例工厂
<bean id="bmwCar" class="com.home.factoryMethod.Car" factory-method="getCar">
</bean>
第四种:装饰者模式
第五种:代理模式
Spring AOP 功能的实现。
第六种:适配器模式
在Spring MVC中,DispatcherServlet
调用 HandlerMapping
,解析请求对应的 Handler
。解析到对应的 `Handler后。不同的handler并无任何联系,为了统一处理,使用HandlerAdapter进行统一的处理。
Spring AOP 的通知(Advice)使用到了适配器模式,Advice 常用的类型有:BeforeAdvice
、AfterAdvice
、AfterReturningAdvice等等。每个类型Advice都有对应的拦截器:
AdviceInterceptor。Spring的通知要通过对应的AdviceAdapter,适配成
MethodInterceptor`接口(方法拦截器)类型的对象
第七种:策略
spring中在实例化对象的时候用到Strategy模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CUcP6eAK-1579404043633)(C:\Users\Administrator\Desktop\TIM截图20200119105317.png)]
beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->getInstantiationStrategy().instantiate(mbd, beanName, parent),getAccessControlContext());
@Overridepublic Object instantiate(RootBeanDefinition bd, @Nullable String beanName, BeanFactory owner) {//如果有需要覆盖或动态替换的方法,则使用cglib进行动态代理,//应为可以在创建代理的同时,将动态方法织入类中//如果没有,直接用反射就可以进行实例化// Don't override the class with CGLIB if no overrides.if (!bd.hasMethodOverrides()) {Constructor<?> constructorToUse;synchronized (bd.constructorArgumentLock) {constructorToUse = (Constructor<?>) bd.resolvedConstructorOrFactoryMethod;if (constructorToUse == null) {final Class<?> clazz = bd.getBeanClass();if (clazz.isInterface()) {throw new BeanInstantiationException(clazz, "Specified class is an interface");}try {if (System.getSecurityManager() != null) {constructorToUse = AccessController.doPrivileged((PrivilegedExceptionAction<Constructor<?>>) clazz::getDeclaredConstructor);}else {constructorToUse = clazz.getDeclaredConstructor();}bd.resolvedConstructorOrFactoryMethod = constructorToUse;}catch (Throwable ex) {throw new BeanInstantiationException...}}}return BeanUtils.instantiateClass(constructorToUse);}else {// Must generate CGLIB subclass.return instantiateWithMethodInjection(bd, beanName, owner);}}
第八种:模板方法
模板方法模式是一种行为设计模式,它定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤的实现方式。
第九种:观察者
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
spring中Observer模式常用的地方是listener的实现。如ApplicationListener。
1、定义一个事件
public class MyEvent extends ApplicationEvent {public MyEvent(Object source) {super(source);System.out.println("发送了邮件");}
}
2、定义事件监听
@Component
public class MyReceive {@EventListenerpublic void receive(MyEvent event){System.out.println("接收到"+event);}
}
3、发布事件
@RestController
public class MailSender implements ApplicationContextAware {ApplicationContext applicationContext;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext=applicationContext;}@RequestMapping("/mtest")public String sendMail(){//创建时间MyEvent myEvent = new MyEvent(applicationContext);System.out.println("准备发-----");//发布事件applicationContext.publishEvent(myEvent);return "success";}
}