AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码。
JDK动态代理和CGLIB字节码生成的区别?
* JDK动态代理只能对实现了接口的类生成代理,而不能针对类
* CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法。
定义bean的方式?
1)XML配置方式;2)注解方式;
bean存储?
利用java反射机制,生成bean实例,实例化的单例bean放入HashMap存储,id作为key;
以DispatcherServlet(前端控制器)为中心的工作:1.DispatcherServlet; 2.HandlerMapping; 3.HandlerAdapter 4.ViewReslover
1)首先用户向服务器发送请求,被DS捕获;(用户->DS 请求)
2)DS收到请求,调用HandlerMapping(处理器映射器)获得Handler相关对象(处理器)(包括Handler及HandlerInterceptor),以HanderExecutionChain对象的形式返回; (DS->HM HM->DS H/HI/HEC)
3)DS根据获得的Handler找到合适的HandlerAdapter(处理器适配器),调用具体的Controller,Controller执行结果ModelAndView返回给DS; (DS->HA Controller; HA->DS MAV)
4)DS将MAV传给ViewReslover(视图解析器),VR解析后返回View,DS根据Model和View渲染视图,渲染结果返回客户端; (DS->VR MAV; VR->DS View; DS->客户端 Model View)
(1.属性; 2.性能;3.注入;4.表名;5.不变)
1.属性:#{para}是预编译,${para}是字符串替换;
2.性能:预编译的sql可以重复利用;所以#{}性能较优;
3.注入:${}是字符串替换,会存在sql注入问题;比如select * from table where name = ${smith or 1 = 1},这样无论是否匹配,都能查到结果;
4.表名:表名必须使用${tablename},因为预编译的占位符进行变量替换后会带上单引号。而表名不能加单引号;
5.不变:如果插入不改变的字符串,比如order by ${para} 那么就可以用${};