首页 沙舟狼客之Java软件工程师面试题

沙舟狼客之Java软件工程师面试题

举报
开通vip

沙舟狼客之Java软件工程师面试题Java软件工程师面试题 沙舟狼客著 2011年3月1日星期二 目录 TOC \o \h \z \u 1. Java基础 - 4 - 1) 请说出你所知道的线程同步的方法。 - 4 - 2) Start和run,Thread和Runnable - 4 - 3) 常见的七种排序: - 4 - 4) java中实现多态的机制是什么? - 5 - 5) 面向对象的特征有哪些方面 - 6 - 6) 抽象类和接口有什么区别 - 6 - 7) error和exception有什么区别 - 6 - 8) 给我一个你最常见到的ru...

沙舟狼客之Java软件工程师面试题
Java软件工程师面试题 沙舟狼客著 2011年3月1日星期二 目录 TOC \o \h \z \u 1. Java基础 - 4 - 1) 请说出你所知道的线程同步的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 。 - 4 - 2) Start和run,Thread和Runnable - 4 - 3) 常见的七种排序: - 4 - 4) java中实现多态的机制是什么? - 5 - 5) 面向对象的特征有哪些方面 - 6 - 6) 抽象类和接口有什么区别 - 6 - 7) error和exception有什么区别 - 6 - 8) 给我一个你最常见到的runtimeexception - 7 - 9) Overload和Override的区别 - 7 - 10) sleep()和wait()有什么区别? - 7 - 11) GC是什么?为什么要有GC - 7 - 12) HashMap和Hashtable的区别 - 7 - 13) &和&&的区别 - 8 - 14) AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? - 8 - 15) 谈谈final,finally,finalize的区别。 - 8 - 16) 类型转换(变态题) - 8 - 17) Boolean类型 - 9 - 18) 常见修饰符 - 9 - 19) 常见集合类的区别 - 10 - 20) 链 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 的实现 - 11 - 2. Hibernate - 13 - 1) Load和get区别, - 13 - 2) 在数据库中条件查询速度很慢的时候,如何优化? - 13 - 3) Hibernate有哪几种查询数据的方式 - 14 - 4) Hibernate工作原理及为什么要用? - 14 - 5) 说下Hibernate的缓存机制 - 14 - 6) Hibernate对象的三种状态是什么? - 15 - 7) 谈谈hibernate的延迟加载和openSessionInView - 15 - 3. JSP/Servlet - 15 - 1) jsp有哪些内置对象?作用分别是什么? - 15 - 2) jsp有哪些动作?作用分别是什么? - 16 - 3) JSP中动态INCLUDE与静态INCLUDE的区别? - 16 - 4) 两种跳转方式分别是什么?有什么区别? - 16 - 5) 说一说Servlet的生命周期? - 16 - 6) xml有哪些解析技术?区别是什么? - 16 - 7) 如何现实servlet的单线程模式 - 17 - 8) JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? - 17 - 9) 四种会话跟踪技术 - 17 - 10) Request对象的主要方法 - 18 - 11) 我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串 - 18 - 12) 如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? - 18 - 13) 在JSP中能发送EMAIL吗 - 19 - 14) Session和cookie的区别 - 19 - 4. Struts - 19 - 1) struts的工作原理: - 19 - 2) Action和ActionSupport的区别 - 20 - 3) 拦截器的配置 - 20 - 4) Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因 - 21 - 5. spring - 22 - 1) spring的工作原理 - 22 - 2) Aop - 22 - 3) Spring通知(advice)的配置 - 23 - 4) spring的自动装配 - 25 - 5) Spring中切面(aspect,advisor)的配置 - 26 - 6) 常用切入点表达式总结 - 26 - 7) spring的bean生命周期 - 27 - 8) 事务的5个隔离级别和7个传播行为 - 28 - 9) Spring事务的配置 - 29 - 9) Spring如何声明事务处理的呢 - 29 - 10) 注入方式 - 29 - 6. J2EE思想 - 30 - 1) 23种设计模式 - 30 - 1.​ Java基础 1)​ 请说出你所知道的线程同步的方法。 ​ wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 ​ sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉InterruptedException异常。 ​ notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 ​ Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 2)​ Start和run,Thread和Runnable Thread是一个类,Runnable是一个接口。类里面有实现的方法,而Runnable只有抽象的接口而已没有实现的方法。其实Thread也是继承Runnable. start方法:用来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体, 它包含了要执行的这个线程的内容, run方法运行结束, 此线程终止, 而CPU再运行其它线程, 直接用run方法: 这只是调用一个方法而已, 程序中依然只有主线程--这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。 3)​ 常见的七种排序: 冒择插希快归堆; 冒泡: 选择: 插入: 快速: 4)​ java中实现多态的机制是什么? 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。 5)​ 面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。 4. 多态性: 多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 6)​ 抽象类和接口有什么区别 ​ 接口可以多重继承 ,抽象类不可以 ​ 接口定义方法,不给实现;而抽象类可以实现部分方法 ​ 接口中基本数据类型的数据成员,都默认为static和final,抽象类则不是 7)​ error和exception有什么区别 error表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况。 exception表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 8)​ 给我一个你最常见到的runtimeexception 9)​ Overload和Override的区别 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写(Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被“屏蔽”了。如果在一个类中定义了多个同名的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型。 10)​ sleep()和wait()有什么区别? 搞线程的最爱sleep()方法是使线程停止一段时间的方法。在sleep时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非(a)“醒来”的线程具有更高的优先级(b)正在运行的线程因为其它原因而阻塞。wait()是线程交互时,如果线程对一个同步对象x发出一个wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到。 11)​ GC是什么?为什么要有GC GC是垃圾收集器。Java程序员不用担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()Runtime.getRuntime()。gc() 12)​ HashMap和Hashtable的区别 都属于Map接口的类,实现了将惟一键映射到特定的值上。HashMap类没有分类或者排序。它允许一个null键和多个null值。Hashtable类似于HashMap,但是不允许null键和null值。它也比HashMap慢,因为它是同步的。 13)​ &和&&的区别 &是位运算符。&&是布尔逻辑运算符。 14)​ AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)? 匿名的内部类是没有名字的内部类。不能extends(继承)其它类,但一个内部类可以作为一个接口,由另一个内部类实现。 15)​ 谈谈final,finally,finalize的区别。 16)​ 类型转换(变态题) ​ int x=4; System.out.println("value is " +((x>4)?99.9:9)); 答案 八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案 9.0 ,问号表达式的后面两个条件有要求,因为前面的是float,所以后面转为float. ​ short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 答案 1错2对,1因为向上转型了,最后导致类型不匹配错误 , 因为s1的+=是一个操作符,能够自动转型, short s1 = 1; s1 = s1+1;这句话在c++里面可以的 ​ System.out.println(5.0942*1000); System.out.println(5.0943*1000); System.out.println(5.0944*1000);的结果 答案 :5094.2 5094.299999999999 5094.400000000001  ​ Int count=1;count+=count++;输出count=2; ​ Try{ System.exit(0); }catch(Exception){ }finally{ System.out.println(“ok”); } ------ Main(){ System.out.println(test()); } Static void test(){ Try{ Return 0; }catch(Exception e){ }finally{ System.out.println(“ddd”); } Return 1; } 输出0; 17)​ Boolean类型 boolean a = false; if (a = true){ System.out.println(true); } else {  System.out.println(false); } 结果为 true 18)​ 常见修饰符 1.​ 访问修饰符public,private.protected,缺省 2.​ Static,final,abstract,native,sychronized,transient,volatile,package a)​ Sychronized:多线程的支持,当一个此方法被调用时,没有其它线程能够调用该方法,其它的synchronized方法也不能调用该方法,直到该方法返回 b)​ Transient:告诉编译器,在类对象序列化的时候,此变量不需要持久保存,主要是因为改变量可以通过其它变量来得到,使用它是为了性能的问题 c)​ Volatile:指出可能有多个线程修改此变量,要求编译器优化以保证对此变量的修改能够被正确的处理 d)​ Native:用该修饰符定义的方法在类中没有实现,而大多数情况下该方法的实现是用C、C++编写的。参见Sun的Java Native接口(JNI),JNI提供了运行时加载一个native方法的实现,并将其于一个Java类关联的功能 19)​ 常见集合类的区别 2.​ ArrayList: 元素单个,效率高,多用于查询  2.Vector: 元素单个,线程安全,多用于查询  3.LinkedList:元素单个,多用于插入和删除  4.HashMap: 元素成对,元素可为空  5.HashTable: 元素成对,线程安全,元素不可为空  集合 : 集合对象:用于管理其他若干对象的对象  数组:长度不可变  List: 有顺序的,元素可以重复  遍历:for 迭代  排序:Comparable Comparator Collections.sort()  ArrayList:底层用数组实现的List  特点:查询效率高,增删效率低 轻量级 线程不安全  LinkedList:底层用双向循环链表 实现的List  特点:查询效率低,增删效率高  Vector: 底层用数组实现List接口的另一个类  特点:重量级,占据更多的系统开销 线程安全  Set:无顺序的,元素不可重复(值不相同)  遍历:迭代  排序:SortedSet  HashSet:采用哈希算法来实现Set接口  唯一性保证:重复对象equals方法返回为true  重复对象hashCode方法返回相同的整数  不同对象 哈希码 尽量保证不同(提高效率)  SortedSet:对一个Set排序  TreeSet:在元素添加的同时,进行排序。也要给出排序规则  唯一性保证:根据排序规则,compareTo方法返回为0,就可以认定两个对象中有一个是重复对象。  Map:元素是键值对 key:唯一,不可重复 value:可重复  遍历:先迭代遍历key的集合,再根据key得到value  HashMap:轻量级 线程不安全 允许key或者value是null  Hashtable:重量级 线程安全 不允许key或者value是null  Properties:Hashtable的子类,key和value都是String  20)​ 链表的实现 1.​ package ChapterFive;   2.​ class Link {   3.​     public E data;   4.​     public Link next;   5.​     public Link(E data) {   6.​         this.data = data;   7.​     }   8.​ }   9.​ class LinkList {   10.​     public Link first;   11.​     //链表中数据项的个数   12.​     public int size;   13.​     public LinkList() {   14.​         first = null;   15.​         size = 0;   16.​     }   17.​     //在表头插入新的数据   18.​     public void insertFirst(E value) {   19.​         Link link = new Link(value);   20.​         link.next = first;   21.​         first = link;   22.​         size++;   23.​     }   24.​     //判断链表是否为空   25.​     public boolean isEmpty() {   26.​         return size == 0;   27.​     }   28.​     //删除表头   29.​     public Link deleteFirst() {   30.​         Link temp = first;   31.​         first = first.next;   32.​         size--;   33.​         return temp;   34.​     }   35.​     //输出链表中的所有数据   36.​     public void display() {   37.​         Link curr = first;   38.​         while (curr != null) {   39.​             System.out.print(curr.data + " ");   40.​             curr = curr.next;   41.​         }   42.​         System.out.println();   43.​     }   44.​     //返回链表中数据项的个数   45.​     public int size() {   46.​         return size;   47.​     }   48.​     //获取从头至尾的第i个数据项   49.​     public Link get(int i) {   50.​         if (i > size() - 1 || i < 0)   51.​             try {   52.​                 throw new IndexOutOfBoundsException();   53.​             } catch (Exception e) {   54.​                 e.printStackTrace();   55.​             }   56.​         Link curr = first;   57.​         for (int n = 0; n < size(); n++) {   58.​             if (n == i)   59.​                 return curr;   60.​             else   61.​                 curr = curr.next;   62.​         }   63.​         return null;   64.​     }   65.​     //输出从头至尾的第i个数据项   66.​     public void remove(int i) {   67.​         if (i == 0)   68.​             deleteFirst();   69.​         else if (i == size() - 1)   70.​             get(i - 1).next = null;   71.​         else {   72.​             get(i - 1).next = get(i + 1);   73.​         }   74.​         size--;   75.​     }   76.​ }   77.​    78.​ public class Link_list {   79.​     public static void main(String[] args) {   80.​         LinkList ll = new LinkList();   81.​         for (int i = 0; i < 10; i++) {   82.​             Long value = (long) (Math.random() * 100);   83.​             ll.insertFirst(value);   84.​         }   85.​         ll.display();   86.​         while (!ll.isEmpty()) {   87.​             ll.deleteFirst();   88.​             ll.display();   89.​         }   90.​         System.out.println("Ok");   91.​     }   92.​ }   2.​ Hibernate 1)​ Load和get区别, Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于: ​ 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。 ​ Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。 ​ load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。 2)​ 在数据库中条件查询速度很慢的时候,如何优化? 1.​ 建索引  2.​ 减少表之间的关联  3.​  优化sql,尽量让sql很快定位数据,不要让sql做全表查询,应该走索引,把数据量大的表排在前面  4.​ 简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据  3)​ Hibernate有哪几种查询数据的方式 4)​ Hibernate工作原理及为什么要用? 5)​ 说下Hibernate的缓存机制 6)​ Hibernate对象的三种状态是什么? 7)​ 谈谈hibernate的延迟加载和openSessionInView OpenSessionInViewFilter是Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,直到这个请求结束,具体是通过一个Filter来实现的。   由于Hibernate引入了Lazy Load特性,使得脱离Hibernate的Session周期的对象如果再想通过getter方法取到其关联对象的值,Hibernate会抛出一个LazyLoad的Exception。所以为了解决这个问题,Spring引入了这个Filter,使得Hibernate的Session的生命周期变长。   有两种方式可以配置实现OpenSessionInView,分别是OpenSessionInViewInterceptor和OpenSessionInViewFilter,功能完全相同,只不过一个在web.xml配置,另一个在application.xml配置而已。我个人比较倾向配置在application.xml里,因为web.xml里配置的东西的太多的话容易发生冲突,虽然可以调整,但是毕竟多了个麻烦。 3.​ JSP/Servlet 1)​ jsp有哪些内置对象?作用分别是什么? request 用户端请求,此请求会包含来自GET/POST请求的参数 response 网页传回用户端的回应 pageContext 网页的属性是在这里管理 session 与请求有关的会话期 application servlet 正在执行的内容 out 用来传送回应的输出 config servlet的构架部件 page JSP网页本身 exception 针对错误网页,未捕捉的例外 2)​ jsp有哪些动作?作用分别是什么? jsp:include:在页面被请求的时候引入一个文件。 jsp:useBean:寻找或者实例化一个JavaBean。 jsp:setProperty:设置JavaBean的属性。 jsp:getProperty:输出某个JavaBean的属性。 jsp:forward:把请求转到一个新的页面。 jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记 3)​ JSP中动态INCLUDE与静态INCLUDE的区别? 动态INCLUDE用jsp:include动作实现 ,它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数 ,静态INCLUDE用include伪码实现,定不会检查所含文件的变化,适用于包含静态页面 <%@ include file="included.htm" %> 4)​ 两种跳转方式分别是什么?有什么区别? 答:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用sendRedirect()方法。 5)​ 说一说Servlet的生命周期? servlet有良好的生存期的定义,包括加载和实例化、初始化、处理请求以及服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroy方法表达。 6)​ xml有哪些解析技术?区别是什么? 有DOM,SAX,STAX等 ,DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问SAX:不现于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问 ,STAX:Streaming API for XML (StAX) 7)​ 如何现实servlet的单线程模式 <%@ page isThreadSafe="false"%> 8)​ JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? JSP是Servlet技术的扩展,本质上是Servlet的简易方式,更强调应用的外表表达。JSP编译后是"类servlet"。 Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是 Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑。 9)​ 四种会话跟踪技术 ​ page否是代表与一个页面相关的对象和属性。一个页面由一个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有 include 动作)表示。这既包括 servlet 又包括被编译成 servlet 的 JSP 页面 ​ request是是代表与 Web 客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)session是是代表与用于某个 Web 客户机的一个用户体验相关的对象和属性。一个 Web 会话可以也经常会跨越多个客户机请求 ​ application是是代表与整个 Web 应用程序相关的对象和属性。这实质上是跨越整个 Web 应用程序,包括多个页面、请求和会话的一个全局作用域 10)​ Request对象的主要方法 11)​ 我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种编码的字符串 12)​ 如何防止在JSP或SERVLET中的输出不被BROWSER保存在CACHE中? 13)​ 在JSP中能发送EMAIL吗 14)​ Session和cookie的区别 Session是基于cookie的(JSESSIONID),位置,储存方式(Map,文件) 4.​ Struts 1)​ struts的工作原理: 2)​ Action和ActionSupport的区别 3)​ 拦截器的配置 A.​ 实现Interceptor接口 B.​ 配置struts 文件 4)​ Action是不是线程安全的?如果不是 有什么方式可以保证Action的线程安全?如果是,说明原因 Action不是线程安全的,不定义类的域,就可以避免线程问题 5.​ spring 1)​ spring的工作原理 2)​ Aop ​ 切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式来实现。 ​ 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。 ​ 通知(Advice):在切面的某个特定的连接点上执行的动作。其中包括了“around”、“before”和“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。 ​ 切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。 ​ 引入(Introduction):用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type declaration))。Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,你可以使用引入来使一个bean实现IsModified接口,以便简化缓存机制。 ​ 目标对象(Target Object): 被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。 ​ AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 ​ 织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。 3)​ Spring通知(advice)的配置 spring的通知(advice)分为方法通知和异常通知;方法通知又有方法调用前(MethodBeforeAdvice),调用中(MethodInterceptor),调用后(AfterReturningAdvice)三种,这三种实现其接口即可;但异常通知在实现ThrowsAdvice后还需手动加入代码,这一点我就不知道为什吗了,哪位高手可以解释一下;下面是我的实现代码; 4)​ spring的自动装配 1、 No:即不启用自动装配。Autowire默认的值。 2、 byName:通过属性的名字的方式查找JavaBean依赖的对象并为其注入。比如说类Computer有个属性printer,指定其autowire属性为byName后,Spring IoC容器会在配置文件中查找id/name属性为printer的bean,然后使用Seter方法为其注入。 3、 byType:通过属性的类型查找JavaBean依赖的对象并为其注入。比如类Computer有个属性printer,类型为Printer,那么,指定其autowire属性为byType后,Spring IoC容器会查找Class属性为Printer的bean,使用Seter方法为其注入。 4、 constructor:通byType一样,也是通过类型查找依赖对象。与byType的区别在于它不是使用Seter方法注入,而是使用构造子注入。 5、 autodetect:在byType和constructor之间自动的选择注入方式。 6、 default:由上级标签的default-autowire属性确定。 5)​ Spring中切面(aspect,advisor)的配置 expression是匹配的方法特征,aop:before/after-returning必须与定义的切面类中的方法名一致, 注意xml的命名空间引用 6)​ 常用切入点表达式总结 execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?) 除了返回类型模式(上面代码片断中的ret-type-pattern),名字模式和参数模式以外,所有的部分都是可选的。 返回类型模式决定了方法的返回类型必须依次匹配一个连接点。 你会使用的最频繁的返回类型模式是 *,它代表了匹配任意的返回类型。 一个全称限定的类型名将只会匹配返回给定类型的方法。名字模式匹配的是方法名。 你可以使用 * 通配符作为所有或者部分命名模式。 参数模式稍微有点复杂:() 匹配了一个不接受任何参数的方法, 而 (..) 匹配了一个接受任意数量参数的方法(零或者更多)。 模式 (*) 匹配了一个接受一个任何类型的参数的方法。 模式 (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型。 下面给出一些常见切入点表达式的例子。 任意公共方法的执行: execution(public * *(..)) 任何一个以“set”开始的方法的执行: execution(* set*(..)) AccountService 接口的任意方法的执行: execution(* com.xyz.service.AccountService.*(..)) 定义在service包里的任意方法的执行: execution(* com.xyz.service.*.*(..)) 定义在service包或者子包里的任意方法的执行: execution(* com.xyz.service..*.*(..)) 在service包里的任意连接点(在Spring AOP中只是方法执行) : within(com.xyz.service.*) 在service包或者子包里的任意连接点(在Spring AOP中只是方法执行) : within(com.xyz.service..*) 实现了 AccountService 接口的代理对象的任意连接点(在Spring AOP中只是方法执行) : this(com.xyz.service.AccountService) ‘this’在binding form中用的更多:- 请常见以下讨论通知的章节中关于如何使得代理对象可以在通知体内访问到的部分。 实现了 AccountService 接口的目标对象的任意连接点(在Spring AOP中只是方法执行) : target(com.xyz.service.AccountService) 任何一个只接受一个参数,且在运行时传入的参数实现了 Serializable 接口的连接点 (在Spring AOP中只是方法执行) args(java.io.Serializable) 请注意在例子中给出的切入点不同于 execution(* *(java.io.Serializable)): args只有在动态运行时候传入参数是可序列化的(Serializable)才匹配,而execution 在传入参数的签名声明的类型实现了 Serializable 接口时候匹配。 有一个 @Transactional 注解的目标对象中的任意连接点(在Spring AOP中只是方法执行) @target(org.springframework.transaction.annotation.Transactional) 任何一个目标对象声明的类型有一个 @Transactional 注解的连接点(在Spring AOP中只是方法执行) @within(org.springframework.transaction.annotation.Transactional) 任何一个执行的方法有一个 @Transactional annotation的连接点(在Spring AOP中只是方法执行) @annotation(org.springframework.transaction.annotation.Transactional) 任何一个接受一个参数,并且传入的参数在运行时的类型实现了 @Classified annotation的连接点(在Spring AOP中只是方法执行) @args(com.xyz.security.Classified) 7)​ spring的bean生命周期 singleton(单例模式):整个springIOC容器中就只有一个对象的实例 prototype:每次请求只生成一个对象(new),生成后有请求方控制,自生自灭 request:与prototype一样,只是只用于web开发中 session:每个session中同一个对象 globalsession:global session只有应用在基于porlet的web应用程序中才有意义,他映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待。好像在spring2.5以后已经取消了 8)​ 事务的5个隔离级别和7个传播行为 隔离级别 1、ISOLATION_DEFAULT: 默认的隔离级别,使用数据库默认的事务隔离级别 . 另外四个与 JDBC 的隔离级别相对应 2、ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的 数据。这种隔离级别会产生脏读,不 可重复读和幻像读。 3、ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔 离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。 4、ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提 交的数据外,还保证了避免下面的情况产生 ( 不可重复读 ) 。 5、ISOLATION_SERIALIZABLE: 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。 传播行为 1、 PROPAGATION_REQUIRED 如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。 2、PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。 3、PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。 当单独调用 methodB 时,因为 当前没有一个活动的事务,则会抛出异常 throw new IllegalTransactionStateException("Transaction propagation ''mandatory'' but no existing transaction found"); 当调用 methodA 时, methodB 则加入 到 methodA 的事务中,事务地执行。 4、PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。 5、PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。 当单独调用 methodB 时,不启用任何事务机制,非事务地执行。 6、PROPAGATION_NEVER 总是非事务地执行,如果存在一个活动事务,则抛出异常 单独调用 methodB ,则非事务的执行。 调用 methodA 则会抛出异常 7、​ PROPAGATION_NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中 .如果没有活动事务 , 则按 TransactionDefinition.PROPAGATION_REQUIRED 属性执行 这是一个嵌套事务 , 使用 JDBC 3.0 驱动时 , 仅 仅支持 DataSourceTransactionManager 作为事务管理器。 9)​ Spring事务的配置 9)​ Spring如何声明事务处理的呢 Spring 提供两种事务处理方式,一种是编程式事务处理;一种是声明式事务处理 1)编程式事务 利用Spring提供的事务管理类进行管理,Spring帮你commit(提交)、rollback(回滚),比直接JDBC简单 2)声明式事务处理 一般配置及顺序 a、配置数据源dataSource b、配置事务管理器TransactionManager,依赖于数据源dataSource c、配置事务代理工厂(设置事务传播属性) d、将事务应用到指定的类中 其中,c、d也可以直接使用aop:config切入的方式进行配置,配置切入点,配置事务通知对象及规则 10)​ 注入方式 1.​ 接口注入(不推荐) 2.​ getter,setter方式注入(比较常用) 3.​ 构造器注入(死的应用) 6.​ J2EE思想 1)​ 23种设计模式 1)​ 工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式都是比较常用的,不同的项目有不同的设计方向,可以参考的设计模式也不尽相同,没有定数,只是上面这几个模式用的比较多一些。 其他的模式我找了一下,都列出来了。   创建型模式     2)​ 1、FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory      工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。  2、BUILDER—MM最爱听的就是“我爱你”这句话了,见到不同地方的MM,要能够用她们的方言跟她说这句话哦,我有一个多种语言翻译机,上面每种语言都有一个按键,见到MM我只要按对应的键,它就能够用相应的语言说出“我爱你”这句话了,国外的MM也可以轻松搞掂,这就是我的“我爱你”builder。(这一定比美军在伊拉克用的翻译机好卖)  建造模式:将产品的内部表象和产品的生成过程分割开来,从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化,客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。  3、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。  工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。  4、PROTOTYPE—跟MM用QQ聊天,一定要说些深情的话语了,我搜集了好多肉麻的情话,需要时只要copy出来放到QQ里面就行了,这就是我的情话prototype了。(100块钱一份,你要不要)  原始模型模式:通过给出一个原型对象来指明所要创建的对象的类型,然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类,产品类不需要非得有任何事先确定的等级结构,原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。  5、SINGLETON—俺有6个漂亮的老婆,她们的老公都是我,我就是我们家里的老公Sigleton,她们只要说道“老公”,都是指的同一个人,那就是我(刚才做了个梦啦,哪有这么好的事)  单例模式:单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。  结构型模式    6、ADAPTER—在朋友聚会上碰到了一个美女Sarah,从香港来的,可我不会说粤语,她不会说普通话,只好求助于我的朋友kent了,他作为我和Sarah之间的Adapter,让我和Sarah可以相互交谈了(也不知道他会不会耍我)  适配器(变压器)模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。  7、BRIDGE—早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM新做了个发型怎么说”这种问题,自己用BRIDGE组合一下不就行了  桥梁模式:将抽象化与实现化脱耦,使得二者可以独立的变化,也就是说将他们之间的强关联变成弱关联,也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系,从而使两者可以独立的变化。  8、C
本文档为【沙舟狼客之Java软件工程师面试题】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_127288
暂无简介~
格式:doc
大小:796KB
软件:Word
页数:33
分类:互联网
上传时间:2011-10-04
浏览量:16