已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1. 反射重写(覆盖):父子重载:一个类内equals&hashCode:为什么要同时覆盖? hashCode覆盖的主要作用是为了配合基于散列的集合一起正常运行,这些结合包括;hashSet,hasMap,HashTable. 对集合的操作?1. hashSet.add(object o);他会先调用这个对象的hashcode()方法,定位到他要放的物理位置 如果该位置上没有元素,则直接把该元素存储在该位置上。 如果该位置有元素,则会调用该对象的equals方法,判断他们是否相同。 相同,则不存储 不相同,则散列到其他地址。2.hashSet.contains(object o);查找一个元素时:首先调用该对象的hashCode方法,若该位置有元素则调用equals方法,否则不调用。默认的hashCode是一个本地方法,返回的是一个与地址所对应的值(但不是内存地址)如果Student 覆盖了equals and hashCode 方法hashSet.add(new student(1,”zs”); /只调用hashCode hashSet.add(new student(2,”ls”); /只调用hashCodehashSet.add(new student(3,”ww”); /只调用hashCodehashSet.add(new student(1,”zs”); /调用hashCode 还要调用equals如果Student 覆盖了equals 但 hashCode 返回值相等hashSet.add(new student(1,”zs”); /只调用hashCode hashSet.add(new student(2,”ls”); /只调用hashCode,1次equalshashSet.add(new student(3,”ww”); /只调用hashCode,2次equalshashSet.add(new student(1,”zs”); /调用hashCode X次equalsString :2.html 有浏览器解析执行,主要:兼容性问题 css 数据与外观分离(主要负责页面的外观) js :用于与页面交互的脚本语言,在浏览器端执行。 作用:1.前端验证(验证不通过,浏览器不提交数据到服务器。)2.ajax核心技术一,用于异步的向服务器发送请求,并动态更新页面。3.与页面交互,生成一些动态效果(比如:嵌入动态文本于HTML页面)4.获取浏览器的相关信息。3.浏览器如何处理URL:http:/ip:port/appname /login.do 第一步:服务器查看有没有appname对应的用户存在,若没有返回404,如有则进入下一步。 第二步:在 web.xml中(与appname所对应的),使用“/login.do”与url-pattern进行匹配 第三步:如果任然没有匹配到,会查询静态资源。 如果找到返回,找不到返回404.4.get&post请求Get:什么时候采用:表单的默认提交方式,直接在浏览器上输入地址,通过链接访问。特点:在地址栏会显示数据,请求数据会放在请求资源路径后面,一般用于向服务器获取资源。Post :设置表单为post方式:特点:数据不会在地址栏显示,数据会存放在实体内容里,一般用于向服务器发送数据。二者对比:get的缺点:提交的数据有限制(因为只能存放在请求行之后) 不安全(浏览器地址栏能看到数据) Post的优点:数据量大(因为存放到实体内容里面) 相对安全(但是实体内容的数据任然没有加密,可以借助工具看到)5.重定向与转发重定向:服务器向浏览器发送一个状态码为302及一个消息头location,浏览器会立即向location所指向的地址发送一个新的请求。 编程:response.sendRedirect(重定向地址)重定向的特点及需要注意的: 重定向的地址是任意的 浏览器中地址栏的地址会变成重定向的地址 一件事情已经做完了。 由于重定向方式产生了一个新的请求,所以经过一次重定向后,request内的对象将无法使用。转发:在同一个应用内部,一个组件将未完成的任务转交给另外一个组件来完成。 编程:request.getRequestDispatcher(另一个组件的地址 ).forward(request, response);特点:一件事情未完成 转发的目的地,只能是同一个应用内部 转发时浏览器地址栏的地址没有任何改变。 转发涉及组件之间,可以共享同一个request,response对象。前后两个页面 有数据传递 用请求转发(servlet查询出数据,转发到jsp),没有则用重定向。要注意的:重定向/转发之前不能有任何的输出(有则报错)。如果缓存中有数据,重定向/转发之前会清空缓存中的数据。6.servlet: 在服务器上运行的小程序.也是扩展web服务器的一种组件。组件(程序员写):组件是符合规范,完成一定功能,并可以单独部署的软件模块,组件一般不能单独运行,需要依赖容器才能运行。容器(一般由大厂商提供):提供组件的运行环境,并且管理组件的生命周期。Servlet容器:提供servlet运行的环境,并且管理servlet的生命周期,一般常见的web容器:比如tomcat,除了一个servlet以外,同时也是一个web服务器。(既是servlet容器,又是web容器)servlet是运行于servlet容器中,可以被servlet容器动态加载,来扩展服务器的功能,并提供特定的服务。servlet按照请求/相应的方式工作。 主要作用:web服务器本身没有计算能力,也就谁说,不能处理动态资源的请求。servlet可以处理动态资源的请求。Servlet响应用户请求的过程: 浏览器输入一个地址(指向一个servlet)http:/ip:port/mytest /login.do1.浏览器依据ip,端口号 连接服务器2.浏览器将请求数据包按http协议打包成一个http请求数据包3.服务器“看出来”这个请求要的是一个servlet(web.xml 中的url-pattern进行匹配),此时服务器中的一个负责通讯的模块(一般叫做servlet引擎)会创建HttpServletRequest实例(HttpServletRequest实际上是一个接口,有服务器提供者实现,该实例包含了请求数据中的数据)还创建了HttpServletResponse实例。4.服务器依据port之后的部分mytest /login.do找到web.xml,依据web.xml中的信息找到对应的servlet类名。 UserMgmt web.UserMgmt UserMgmt *.do 会查看该servlet有没有对应的实例,如果没有则创建实例,如果有则使用现成实例(此时可能出现线程安全问题)/service(HttpServletRequest request, HttpServletResponse response)/对于程序员,就操作这两个对象。接下来调用service()方法。Service方法里面的代码可以通过HttpServletRequest提供的方法获取请求中的数据。并且可以将处理之后的结果通过HttpServletResponse提供的方法设置返回的结果。5.servlet引擎从HttpServletResponse获取数据,生成http响应数据包,发送给浏览器。6.servlet生命周期:核心接口:servlet接口(所有的servlet必须实现该接口)该接口主要定义三个方法:init(ServletConfig config):初始化方法 ServletConfig:主要用于获取servlet配置参数。 service(req,res):处理请求 (判断get/post请求,调用响应的doget/dopost) destroy():销毁资源 容器根据自己的算法,在删除之前调用destory()释放资源。servlet容器默认调用有参的(GenericServlet 类中)public void init(ServletConfig config)this.config= config;init();1、实现servlet接口2、继承GenericServlet(实现service 方法 )3、继承HttpServlet类(重写doGet,doPost方法就行)默认的init()方法由GenericServlet来实现,如果想自定义自己的初始化过程,可以重写Init()(直接写要写的代码)方法或重写init(ServletConfig config)(要调用父类的super.init(config))7.Why?jsp: 因为直接使用servlet生成动态页面过于繁琐,使用jsp生成动态页面更方便。(jsp 不需要编译,直接打包,就可以运行)Jsp(java server page):服务器端动态页面生成技术,主要组成部分是html元素,以及少量java代码,Jsp:如何运行 当访问某个.Jsp文件时,jsp引擎(servlet容器中的某一个特点的模块)会将.Jsp文件转换为.Java 文件(.java就是一个servlet)然创建其实例,并调用其service()方法。 Jsp-java对于java代码片段:把代码直接放在service()方法中对于java表达式:放到service()方法中,使用out.prin()输出 对于html :放到service()方法中,使用out.write()输出注:print(null)输出 null, write(null)输出”对于:声明的变量会作为对应的servlet的属性 方法。一个独立方法 (不建议用,容易导致线程不安全)8. Session & cookiehttp是无状态的,(可以利用有限的资源为多个客户服务)即:http服务器不记录哪一个浏览器访问了要记录状态的情况:比如购物系统,要记录客户端的状态。Cookie:将用户的状态保存在客户端。Session将用户的状态保存在服务器端。Cookie:浏览器访问某个服务器时,服务器会创建一部分数据。(以消息头set-cookie的方式)发送给浏览器,浏览器会将这部分数据保存下来。当浏览器再次访问该服务器时,将会把这部分数据发送给服务器。创建:response.addCookie()查询:request.getCookies()Cookie限制: 1.cookie只能保存字符串,并且对于中文,需要编码。 2.cookie大小有限制(4k左右) 3.cookie的个数也有限制(本地大约三百) 4.cookie不是很安全 5.cookie可能被用户禁止。Cookie的时用场合:自动登录,网页换肤,。路径问题:http:/ip:port/appname/jsp01/jsp01.jsp创建cookie时都会有一个默认的path 此时为:/appname/jsp01当请求这个路径之下的,都会把cookie带过去egg: /appname/jsp01/acd/cde.jsp/appname/jsp01.jsp 则不会。Session:浏览器访问服务器时,服务器会创建一个对象(session对象),同时,还会生成一个标识该对象的唯一字符串(sessionID),服务器在默认的情况下使用cookie机制将sessionID发送到浏览器,浏览器下次访问时,会将sessionID携带到服务器,服务器使用sessionID查找对应的session对象。用户禁止cookie:使用:URL重写机制来解决,url+sessionID 即在访问某个需要session机制支持的组件时,不需要在浏览器地址栏输入地址,而是通过服务器生成的URL地址来访问。response.encodeURL(url)/在链接,表单提交时使用。 response.encodeRedirectURL(url)/在重定向时,使用session优点: 相对于cookie机制,安全,存放的数据可以是对象,存放的数据量也更大。 缺点: 所有的数据都存在服务器端,服务器端压力比较大,一般会采取激活,钝化机制,将session当中的数据临时保存到文件或者数据库。 Servlet线程安全问题:在默认情况下,容器只会为某个servlet维护一个实例,当多个请求到达容器时,有可能多个线程会访问同一个实例。 如何解决: 1.加锁。比如可以使用synchronized对方法或者代码块加锁。 2.实现SingleThreadModel 接口 (servlet容器会为每一个请求创建一个与之对应的实例,不建议使用,因为这样会创建大量的servlet对象) 3.避免使用全局变量(实例变量),使用局部变量。 4.尽量不对属性值进行修改(即:尽量不要对全局变量值,进行修改。)Ajax:通过浏览器内置的XMLRequest异步的向服务器发送请求,服务器在处理完请求后,返回数据给XMLRequest,通过JavaScript可以获取XMLHttpRequest中的数据,然后使用该数据更新页面。编程: 1.获取XMLHttpRequest对象 2.使用 XMLHttpRequest对象 1)url 2)XMLHttpRequest.open(get/post,url,true) 3)XMLHttpRequest.onReadyStateChange = fun1;/注册回调函数,用于处理服务器请求。 4)XMLHttpRequest.Send()3.在服务器端编写相应代码处理请求。再服务器端,一般不会返回完整的页面,只需要返回部分数据。4.在回调函数中,通过XMLHttpRequest获取数据,然后更新页面。El&jstl 自定义EL即Expression Language(表达式语言)EL的语法:$ EL exprission $ 或 $ beanname JSTL( JSP Standard Tag Library)是JSP标准 标签库 自定义el函数:1.写一个java类,定义一个或者多个public static 方法,在方法中实现函数逻辑。2.在.tld文件中描述该函数。(在jstl库中,找到fn.tld 参考其格式)3.在jsp页面中,使用taglib指令导入相应的函数。自定义标签: 1.写一个java类,实现SimpleTag接口,或者继承SimpleTagSupport。 2.在java类中,重写 doTag()方法,在该方法当中,实现标签的业务逻辑。 3.在.tld文件当中,描述标签 4. 在jsp页面中,使用taglib指令导入相应的标签。OGNL(Object-Graph Navigation Language),大概可以理解为:对象图形化导航语言。是一种可以方便地操作对象属性的开源表达式语言。过滤器:在servlet规范中定义的一种特殊的类,可以用来拦截服务器调用servlet的过程。编程: 1.写一个类,实现implements Filter接口 2.在doFilter()方法里,实现过滤的逻辑。 3.在web.xml中配置过滤器 CommentSizeFilter web.CommentSizeFilter CommentSizeFilter /comment 过滤器的优先级:按配置的先后顺序执行SSH内容:Struts2负责显示层和控制层,Spring负责业务层,hibernate负责持久化层。Struts2:工作流程浏览器 1请求 过滤器 2调用 action 3调用 业务类 action 4转发 jsp 5应答 浏览器1. Action中获取jsp的值:1、页面中name的属性和action中的属性必须保持一致。2、Action中的属性必须有get和set方法。3、满足这两个条件就实现了属性驱动。实现原理:struts2会拦截器public class ActionMappingParametersInteceptor extends ParametersInterceptor根据反射的机制,调用对应action的对应set方法,获取页面表单的值。模型驱动:public class ModelAction extends ActionSupport implements ModelDrivenprivate User user = new User();Overridepublic User getModel() return user;过程为:当浏览器提交ModelAction.action请求时,先经过拦截器。其中有一个拦截器为ModelDrivenInterceptor,从这个源代码可以看出,这个拦截器的作用就是获取实现了ModelDriver接口的action的模型驱动。在这里为user。然后把模型驱动利用push方法压入到栈顶。这样我们就能直接通过属性进行回显和赋值了。通过这个图也可以看出模型驱动的拦截器在参数拦截器前面,也就是先把模型驱动压入栈顶,再进行赋值。模型驱动过程:当用户触发UserAction动作时,ModelDriven拦截器会调用相关UserAction对象的getModel()方法,并将返回值(User实例)压入到valueStack栈中,接下来parameters拦截器将把表单中的字段映射到valueStack栈顶对应的各个属性当中。因为此时栈顶是刚刚被压入的模型,所以模型被填充。不能转换的怎么办:比如struts2 要求的日期是:yyyy-mm-dd但如果是yyyyMMdd怎么办?1、 写一个java类,这个类必须继承DefaultTypeConverter或者实现TypeConverter接口。2、 配置自定义的类型转换器: 1.基于字段(局部的) 创建一个属性文件actionName(根据action类名来写)-perties,该文件需要与相对应的动作类放在同一目录下。Egg:UserAperties 中 createTime = com.lyg.converter.DateConverter 2.基于类(全局的)在根目录下:创建xwork- perties Java.util.Date = com.lyg.converter.DateConverter2.国际化1.定义不同的资源文件 resources_en_US.propertiesresources_zh_CN.perties(默认)2.在struts.xml 中配置通过ie internet选项 修改 语言来测试。2.自定义拦截器:拦截器是AOP的一种实现所有的拦截器都实现了Interceptor接口,或者继承了Interceptor接口扩展类实现类。重写init(),intercept(),destroy()方法intercept()每次请求就执行一次,做相关的处理工作在struts.xml 中配置,注册 即:把默认栈加入到自己写的拦截器中使用自己写的拦截器栈:说明:使用拦截器栈。从上面声明部分可以看出,accessInterceptorStack栈既包括了自定义的拦截器,又包括了struts2内部的拦截器栈。拦截器与过滤器的区别; 1)拦截器是基于Java反射机制的,而过滤器是基于接口回调的。s2)过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器。3)拦截器只能对Action请求起作用,而过滤器可以对所有请求起作用。4)拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。3.文件上传4.struts2 手工验证 &xml验证Get/set获取数据验证:public void validate() 这是一个默认的实现,子类应该覆盖整个方法去完成验证逻辑,执行后filedError为空,将执行action中的处理方法。针对所有业务方法:validate()针对某一个业务方法:validateLogin()4.ognl 对象导航语言 struts2默认表达是语言# 访问OGNL上下文和action上下文 #request.username 等价于 request.getAttribute(“username”) 访问根元素则不需要% 告诉环境里面的是ognl 表达式。$: 用于在国际化资源文件中,引用OGNL 用于在struts.xml配置文件中,引用OGNL表达式。比如:abc.jsp?username=$username5.回显回显是用栈顶元素值回显。 方法一:要么修改压入到栈顶元素的属性值。方法二:要么删除栈顶元素,压入新构建的对象。 注意:不能使用赋值 因为赋值改变的是引用,不会改变值栈的值。6.处理表单重复提交 1.在表单中增加隐藏域: 2.在默认拦截器栈中加入,令牌拦截器 并配置针对的方法。(修改默认拦截器)3.在struts.xml 中增加一个返回结果类型result abc.jsp 表单重复提交后转到的页面7.valueStack 值栈OgnlValueStack 包含: 一个root (对象栈)-ArrayList一个context-Map(跟确切地说是一个ognlcontext)Ognlcontext: 包含一个默认的顶层对象root (是OgnlValueStack 中root对象的一个拷贝) 此处的值:不需要# 直接通过元素名访问。一个map 对象此处的值:需要#访问。Valuestack 在 ActionContext 中,而ActionContext 在ThreadLocal 中,所以 可以保证数据的安全性。Hibernate:1.Jdbc与hibernate比较:Jdbc :优点效率高,连接池 代码繁琐,没有数据缓存。Hibernate:优点 面向对象编程,数据缓存 提出了缓存机制,这样可以使访问数据的效率提高很大。 缺点:大量数据的条件下不适合,程序员对hibernate生成的sql语句不可控。对于sql优化要求很高的项目中,不适合。2. 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。3.理解sessionFactory 1.在sessionFactory 中存放着配置文件和所有的映射文件。 2. sessionFactory是一个重量级的类。 3.一个数据库只能有一个sessionFactory。 4.一个配置文件只能连接一个数据库 5.只要创建了sessionFactory,表就创建完了 6. sessionFactory 存放的数据是共享的,但这个类的数据本身是线程安全的。7. sessionFactory是一个接口,其实现类是:sessionFactoryImplSessionFactory 线程安全的Session 线程不安全采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭。4.对象的状态 简单理解:内存中 有两个区域 一个区域与一般内存一样 另一个是hibernate内存区域位于一般内存区域的对象:临时对象位于hibernate内存区域的对象:持久化对象处于hibernate内存中的数据被清除后,被清除的对象 叫做 游离对象。持久化对象有3种状态:持久化状态(Persist):Session的save方法把临时对象转变为持久化对象。Session的load()或get()方法返回的对象总是处于持久化状态。Session的update(),saveOrUpdate()方法使游离对象转变为持久化对象。当一个持久化对象关联一个临时对象,在允许级联保存的情况下,session在清理缓存时会把这个临时对象也转换为持久化对象。OID 不为 null (oid对象标识符)位于 Session 缓存中持久化对象和数据库中的相关记录对应Session 在清理缓存时, 会根据持久化对象的属性变化, 来同步更新数据库在同一个 Session 实例的缓存中, 数据库表中的每条记录只对应唯一的持久化对象临时状态(transient): 当通过new语句创建了一个java对象,它处于临时状态。此时不和数据库中的任何记录对应。在使用代理主键的情况下, OID 通常为 null不处于 Session 的缓存中在数据库中没有对应的记录游离状态(Detached)当调用session 的close()方法时,session的缓存被清空,缓存中的数据所有持久化数据都变为游离对象。如果在应用程序中没有引用变量引用这些游离对象,它们就会结束生命周期。Session 的evict()方法能够从缓存中删除一个持久化对象,使他变成游离状态。当session的缓存保存了大量的持久化对象,会消耗许多内存空间,为了提高性能,可以考虑调用evict() 方法,从缓存中删除一些持久化对象。OID 不为 null不再处于 Session 的缓存中一般情况需下, 游离对象是由持久化对象转变过来的, 因此在数据库中可能还存在与它对应的记录saveOrUpdate: 该方法同时包含save和update方法,如果参数是临时对象就用save方 法,如果是游离对象就用update方法,如果是持久化对象就直接返回(不执行)。如果参数是临时对象就用save方法5.映射关系:主键产生机制:Increment,Identity,Sequence,。一对多:classes studentStudent.java 中 private Classes classes;Classes.java 中 private Set students;配置文件:Student.hbm.xml /外键 描述了,通过student建立与classes之间的关系Classes.hbm.xml / 指出Classes和那个对象进行关联。多对多:Course student Student.hbm.xml Course.hbm.xml 一般一对多的涉及到关系的维护:都通过多的一方来维护。避免发出update语句Inverse:不维护关系 false 维护Cascade: 级联 6.一级缓存&二级缓存一级缓存:一级缓存在session中存放 存放私有的 session 级别的缓存只要一个对象是持久化对象,数据就在一级缓存中。把缓存中的数据同步到数据库:session.flush()把数据库中的数据同步到一级缓存:session.reflush() 只能同步一个对象清空一级缓存:session.clear();二级缓存:二级缓存在sessionFctory中存放 存放共享的 sessionFctory级别的缓存 存放很少被修改的数据,数据可以公开的 EhCache, OSCache, JBossCache查询缓存:依赖于二级缓存,所以必须开启二级缓存才可用。 查询数据时:如果查询缓存存在。则直接返回。否则 到数据库查询,然后把查询结果放在查询缓存。 缓存的作用:1。减少访问数据库的频率。2。保证缓存中的对象与数据库中的相关记录保持同步。For(int i=0;i10000;i+)Session.save(object); Hibernate: For(int i=0;i10000;i+)If(i%50=0)Session.flush();/同步Session.clear();/清空Session.save(object);7.抓取策略:必须是一个对象操作其关联对象。当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL 或条件查询(Criteria Query)中重载声明。 连 接抓取(Join fetching) - 一次性把两张表的数据查出来 查 询抓取(Select fetching) - 一个一个加载,先加载一个,在加载关联的。 子查询抓取(Subselect fetching) - 通过需求分析判断,如果存在子查询,则选择。 批量抓取(Batch fetching) - 8.懒加载针对数据库中的大数据,不希望特别早的加载到内存中,当使用到的时候在加载。 类懒加载:默认lazy=”true” 只有用session.load()才能懒加载集合懒加载:针对一对多或者多对多的情况,加载set集合时决定在什么时候给集合填充数据。当指定为懒加载时:只有使用到set集合时,他才会发出sql语句。Spring:1.IOC:控制反转”,不是什么技术,而是一种设计思想,在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。 由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。依赖注入(DI):被注入对象依赖IoC容器配置依赖对象所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的。控制的什么被反转了?就是:获得依赖对象的方式反转了。依赖注入的三种配置方式: 1.通过set方式 2.通过构造函数 3通过注解(只能用于引用类型)利用spring ioc和di 做到了完全面向接口编程。 比如:客户端做到完全面向接口编程。 2.Spring 容器加载过程:1.spring容器关于ioc和di:启动过程-2.加载配置文件,启动spring容器-3.spring容器会 * 如果有bean,则直接会为该bean创建对象 * 如果有类扫描的注解解析器,则会按照解析器的规则做4.如果bean中有属性,则调用set方法(构造函数)给属性赋值或者利用Resource注解给属性赋值5. 创建对象之后,方法调用之前,会执行init方法,spring容器调用6. 在客户端调用方法7. 执行destroy方法,spring容器调用(针对单例)8.关闭容器3.注解:必须依赖于类中的某个部分Resourse(name=“user”) namePrivate User user;name=“user” 按照user 与容器中的进行匹配。 不行 报错不写,则先按照user 匹配,不成功在按照类型匹配。 再不行 报错 4.动态代理:AOP(面向切面编程)通过代理模式:把日志,安全检查,权限重用了,做到了代码块的重用。面向切面编程。代理对象的方法:就是拦截器invoke方法体的内容。 代理对象的方法把目标方法和切面整合在一起了。 Jdk代理: 四个条件:目标接口 目标类,拦截器,代理类 目标类和代理类实现了共同的接口 拦截器必须实现InvocationHandler接口,而接口中的invoke方法体的内容就是代理对象方法体的内容。客户端调用代理对象的方法时,invoke方法执行。代理对象和目标类 实现了共同的接口,且代理类中有目标类的引用。Cglib代理:用CGlib生成代理类是目标类的子类。用CGLib生成的代理类重写了父类的各个方法。拦截器必须实现MethodInterceptor接口,而接口中的Interceptor方法体的内容如果bean有代理对象,则返回代理对象,没有则返回原对象。该目标类实现了接口 则spring 容器会采用jdk代理,否则cglib原理:1.加载配置文件,启动spring容器。2.spring容器为bean创建对象3.解析AOP的配置解析切入点表达式。4.看纳入spring管理的哪个类和切入点表达式匹配,如果匹配则创建代理对象。(拦截器由spring 内部实现)5.代理对象的方法 = 目标方法 + 通知6. 客户端在context.getBean()时,该目标类实现了接口 则spring 容器会采用jdk代理,否则cglib切入点表达式expression确定哪个类可以生成代理对象切入点表达式
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 加气混凝土制品工岗前进阶考核试卷含答案
- 农业经理人安全宣传模拟考核试卷含答案
- 供水管道工岗前班组建设考核试卷含答案
- 2026年医师法解读培训课件(知识竞赛版)
- 2026年小儿喘息性肺炎健康宣讲
- 筒并摇工岗位知识评优考核试卷含答案
- 味精提取工变革管理考核试卷含答案
- 玻璃配料熔化工岗前纪律考核试卷含答案
- 中央空调清洗工绩效目标强化考核试卷含答案
- 化学农药生产工变革管理模拟考核试卷含答案
- 2026年广州市海珠区教育系统引进教育管理急需人才6人考前冲刺密卷及参考答案详解【满分必刷】
- 2026秋小学人音版音乐二年级上册(新教材)教学计划
- 国网运检培训课件
- 2024年高考数学全国一卷试题和答案
- 血液科护士与患者沟通技巧
- 绿色建筑认证
- 高职高专教育英语课程教学基本要求(试行)A级-附表四(词汇表)
- 普通高中英语课程标准(2017年版 2020年修订)词汇表
- 陕西省公路工程通用表格
- 辽宁众辉生物科技有限公司年产8500吨农药原药、8000吨医药农药中间体及副产生产项目环境影响报告书
- GB/T 10824-2022充气轮胎轮辋实心轮胎技术规范
评论
0/150
提交评论