1、工厂模式
? ? ? ? spring的core模块最主要的功能就是提供了ioc容器,ioc容器就是工厂模式的实现,ioc容器读取我们对于bean的定义与配置,使用工厂模式,依赖java的反射机制去创建bean实例,执行bean的装配。
2、单例模式
? ? ? ? 单例模式限制某个类在内存中只会创建出一个这个类的对象,永远不会有第二个对象创建出来,spring容器创建的bean默认都是单例的,spring bean支持的作用域有singleton、prototype、request、session、global session,我们可以通过在xml配置文件中设置<bean>标签的scope属性、或者是在使用了@Controller、@Service、@Repository、@Component注解的类上添加@Scope注解来定义bean的作用域。
3、代理模式
? ? ? ? 什么是代理模式?
? ? ? ? 有的时候为了限制对于某个类的对象的访问,我们要去创建一个代理类,将直接访问委托类的方式,改为访问代理类,在代理类内部去访问委托类,我们可以在代理类内部对委托类添加一些增强的业务逻辑,这便是代理模式。
????????代理模式分为静态代理和动态代理,静态代理与动态代理的区别在于代理类的创建时机,静态代理的代理类是由我们手动创建的,所以代理类的类型在编译期就确定了,所以静态代理又称为编译期增强;动态代理的代理类是在程序的运行期间生成的,代理类的类型要到运行期间才能确定,所以动态代理又称为运行时增强。
????????动态代理有jdk动态代理和cdlib动态代理两种实现,spring aop就是由动态代理实现的,它默认使用jdk动态代理,但是jdk动态代理有个前提是,委托类必须实现了接口,如果委托类没有实现任何接口的话,就只能用cglib代理了。
? ? ? ? spring aop:
? ? ? ? aop是面向切面编程,是oop面向对象编程的补充,aop是将封装好的不同的对象横切开来,抽取出它们共同的功能去实现为一个切面,为这个切面定义切入点和通知逻辑,再将这个切面的通知织入到目标对象的连接点上。使用aop能将那些与业务无关却被各个业务模块所共同调用的部分做统一的实现和管理,实现了业务逻辑和基本支持服务的解耦,并且提高了代码的复用性和可维护性。我们可以用aop来实现登录校验、鉴权、记录日志等功能,spring还用aop实现了声明式事务管理。spring的aop模块支持spring aop和Aspectj aop。
? ? ? ? Aspectj是一个aop框架,Aspectj aop定义了aop语法,扩展了java语言,它使用专用的编译器来生成遵循java字节编码规范的class文件,它是用静态代理实现的,它提供了一组注解,使用这一组注解能够让编译器在编译期间将切面定义的通知代码织入到连接点对应的方法前后,来实现方法的增强。
? ? ? ? spring aop的核心功能是使用jdk动态代理和cglib动态代理实现的,用jdk动态代理创建的代理类会与委托类实现同样的接口,并自动继承Proxy类,它会自动创建代理对象,拦截目标对象方法的执行,将通知织入到目标对象的连接点上,为目标方法实现业务增强。spring aop借鉴了Aspectj 的注解驱动aop的方式,在类上加@Aspect注解就能够定义切面【当然还要引入Aspectj的炸包:aspectjweaver.jar】,但spring aop只是使用了AspectJ的注解功能,核心功能还是用jdk动态代理和cglib动态代理实现的。
? ? ? ??
4、模板方法模式
? ? ? ? spring框架提供的JdbcTemplate、RestTemplate、TransactionTemplate等用Template命名的类都是模板方法模式的实现,如JdbcTemplate内部封装了jdbc操作,提供了方便易用的api来实现数据库操作。
5、适配器模式
? ? ? ? 什么是适配器模式:
? ? ? ? 有的时候我们想使用某个类,但是这个类的接口又不符合我们的需求,这时就需要创建一个适配器类,在这个适配器类中提供一个符合需求的接口,并在这个接口中调用被适配类的接口,来让被适配类符合我们的需求。
? ? ? ? 适配器模式分为对象适配器和类适配器两种,它俩的区别是适配器类和被适配类的关系,对象适配器中,它俩是引用关系,在适配器类中有被适配类的引用;类适配器中,它俩是继承关系,适配器类继承被适配类。对象适配器模式更常用,因为java是单继承,类适配器模式中,适配器类继承了被适配类就无法再继承其他类了。
? ? ? ? spring mvc中的HandlerAdapter就是适配器模式的实现。在处理请求的时候,DispacherServlet会去调用HandlerAdapter,让HandlerAdapter去执行相应的Controller的方法。