本帖最后由 小石姐姐 于 2017-11-27 09:55 编辑
1:选择使用Spring框架的原因(Spring框架为企业级开发带来的好处有哪些)?
答:可以从以下几个方面作答:
- 非侵入式:不强制性的要求实现Spring框架中的接口或继承Spring框架中的类。
- IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码。有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的精神"不要重复的发明轮子"。
- AOP(面向切面编程):通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。
- MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts 2几条街,为Web表示层提供了更好的解决方案。
- 事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。
- 其他:选择Spring框架的原因还远不止于此,Spring为Java企业级开发提供了一站式选择,你可以在需要的时候使用它的部分和全部,更重要的是,你甚至可以在感觉不到Spring存在的情况下,在你的项目中使用Spring提供的各种优秀的功能。
2:aop底层原理
Jdk实现动态代理要求被代理对象必须实现接口
CGLIB动态代理无须被代理对象实现接口
Spring在帮我们生成代理对象的时候会去检查我们的被代理对象是否有实现接口,如果实现了接口使用jdk帮我生成代理对象,否则使用CGLIB帮我们生成代理对象。
Jdk动态代理
CGLIB动态代理
CGLIB(Code Generation Library)是一个开源项目
是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。CGLIB包的底层是通过使用一个小而快的字节码处理框架ASM,来转换字节码并生成新的类
测试
总结:
Spring实现动态代理有两种方式:
Jdk动态代理,该代理方式需要被代理对象实现接口,jdk动态代理要用到
Proxy类以及InvocationHandler接口
CGLIB动态代理:无需被代理对象实现接口,其底层是将被代理对象当作父类,通过继承父类帮助我们生成代理对象.CGLIB动态代理要用到
Enhancer类和MethodInterceptor接口
3:spring整合aspectJ进行aop开发
被代理对象
增强的逻辑
基于xml的实现方式
1:被代理对象
2:增强逻辑(advice)
3: 配置切面
<!-- 配置目标对象 -->
<bean id="studentDAOimpl" class="com.taotao.dao.impl.StudentDAOimpl"></bean>
<!-- 配置增强逻辑 -->
<bean id="studentAdvicer" class="com.taotao.advice.StudentAdvicer"></bean>
<!-- 配置切面 -->
<aop:config>
<aop:aspect ref="studentAdvicer" proxy-target-class="false" >
<aop:before method="before" pointcut="execution(* *.add(..))"/>
<aop:after-returning method="after" pointcut="execution(* *.add(..))"/>
<aop:around method="around" pointcut="execution(* *.add(..))"/>
<aop:after-throwing method="exception" pointcut="execution(* *.query(..))"/>
<aop:after method="finalm" pointcut="execution(* *.query(..))"/>
</aop:aspect>
</aop:config>
基于注解的方式
1:编写目标类 ,目标类加上@service注解,同时启动扫描
2:编写增强
@Before("execution(* *.query(..))")
public void before(){
System.out.println("方法执行之前");
}
@AfterReturning("execution(* *.query(..))")
public void after(){
System.out.println("方法执行之后");
}
3:配置
<context:component-scan base-package="com" />
<!—启动aspectj注解-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
4:你如何理解AOP中的目标对象、连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、织入(Weaving)、切面(Aspect)这些概念?
目标对象target
指的是需要被增强的对象,由于spring aop是通过代理模式实现,从而这个对象永远是被代理对象。
连接点(join point)
所谓连接点是指那些被拦截到的点,在spring中这些点指的是方法,因为spring只支持方法类型的连接点
切入点(pointcut)
表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方
简单说切入点是指我们要对哪些连接点进行拦截的定义
通知(advice)
增强逻辑代码
切面aspect
是切入点和通知的结合
织入weaving
织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期,类装载期,运行期进行。
Spring采用动态织入,而aspectj采用静态织入
代理Proxy
一个类被AOP织入增强后,就产生一个结果代理类
通过画图讲解AOP相关术语
5:面试题:IOC和DI区别?
IOC 控制反转,是指对象实例化权利由spring容器来管理
DI 依赖注入 在spring创建对象的过程中,对象所依赖的属性通过配置注入对象中。
6:你对aop的理解
Aop面向切面编程,aop是一种代理设计模式,通过给目标对象生成代理对象去增强目标对象。
生成代理对象的方式有两种1种是jdk的动态代理,这种代理要求目标对象要实现接口,另外一种是通过CGLIB生成代理对象,这种无需目标对象实现接口,其本质是将目标类当作父类,通过继承父类生成代理对象,。
在实际开发中我们使用spring对aspectJ的整合去生成代理对象,有基于xml的配置方式,有基于注解的配置方式
在我的项目中,我一般使用aop去实现方法前后打印日志,方法前后去记录时间,同时使用声明式事务处理统一处理事务。
在目标对象调用的过程中我们完全察觉不到切面,切面不对主逻辑构成干扰,可插拨。
|
|