spring
我有使用过spring,我使用spring的话,主要是使用里面的一个IOC还有一个AOP。
IOC
我先给您说下这个IOC吧,IOC的话我使用它主要是用来管理这个对象的。像之前的一个很MVC经典三层,它们各层之间的对象都是耦合度特别的强,通过new来创建,new每一层,才能调到每一层,而我使用IOC能够对这个MVC三层进行一个解耦。
我的具体做法(配置)是在这个spring的一个配置文件中读取一个bean标签使用一个叫做class的一个属性,然后(将)这个对象加入到这个IOC容器中,但也要取一个ID属性,方便对这个对象的一个取用,也可以使用一个叫@configration这么一个类,然后在相应的一个方法上面,将return回来的对象,然后通过@bean的一个注解,把它加入到一个spring的IOC容器中。
它的方法名就是一个默认的一个ID,也可以使用一个在这个@bean注解里面,起一个ID(属性),改下这个名字(ID)。在起用这个IOC(容器中)对象的时候,可以使用两个注解,一个是@resource可以取出这个对象
;一个是@autowire一个注解也可以取出这个对象。而@resource它取出来是按一个名字来取得,而这个@autowire取的话是按照一个类型来取这个对象的,而这个IOC的一个底层的话是有一个map来做这个IOC的容器。
(重点解耦)
我目前自己对ioc理解是解耦,不用像传统那样去new 来实现对象初始化,而且把对象的创建权交给spring bean 容器去管理。
自己简化的ioc 实现过程是:定位xml文件——解析xml文件——注册bean——实例化bean。
定位xml文件:通过applicationContext的实现类Class PathResource 找到xml文件
解析xml文件:通过beanDefinition解析xml文件,解析后的结果封装成一个beanDefinitionHolder
注册bean:通过defaultListableBeanFactory类,创建ConcurrentHashMap集合,通过beanDefinition提供的信息,将bean的name和class保存在集合中。
实例化bean :通过beanFactory 类的getBean()中完成初始化。
AOP
OOP
传统OOP面向对象开发,逻辑上是自上而下的,在这些自上而下的过程中会产生一些横切问题,这些横切问题与主业务无关,会散落到代码的各个地方,造成难以维护。而AOP编程思想就是把这些横切的问题和主业务分开,达到与主业务逻辑解耦的目的
AOP
AOP的话它是横切性的一个编程思想也就是将这个代码横切性的编入到代码中。而这个AOP的编程思想,主要有两种方式,
一种的话使用aspectj的一个方式,还有一种就是使用springAOP的一个方式。springaop它是借助了这个aspectj的语法实现了这个AOP编程思想。配置这个springaop就要在它的spring配置文件上面,配置上它的切面,还有需要增强的类型以及相应的切入点,当然也可以使用注解的方式进行配置,也就是起一个叫@aspect的一个切面类,然后在类里面起方法,这个方法里面的内容呢就是相应的你要植入到目标类的一个逻辑代码,然后并加上了相应的一个增强类的一个注解,比如说@before@after,然后用@pointcut来指定这个目标类上面的哪个方法执行。
而我使用aop比较多的场景的话,就是这个监控日志,事务控制,以及这个权限管理这块。
底层实现:它使用的是一个JDK的一个动态代理和这个cglib的一个动态代理。
面试官可能问你是JDK的一个动态代理还是cglib的一个动态代理,它上面的话在配置这个aspect(切面)的时候CGlibProxy好像是这个属性然后它默认是false的,你把它改成true的话,它就变成这个cglib的一个动态代理了,它默认的话是JDK的一个代理