JAVA随记

  • 接口中只能含有静态常量
  • hibernate批量更新和批量删除的时候会占用大量的内存,因为其要更新一线缓存,最好直接用JDBC
  • 熟悉的设计模式:单例、代理、装饰、MVC、门面、链式、工厂、

l  动态代理:

也有静态代理,即被代理类和代理类都实现同一个接口,代理类持有被代理类的实例,调用时先调用代理类的方法,它先预处理一些步骤再调用被代理类再后处理;

动态代理有JDK动态代理和CGLIB动态代理两大类。

JDK动态代理分析:

先要实现一个InvocationHandler,如下,即在指定的方法执行前后你要加上哪些行为的实现:

  1. public class MyInvocationHandler implements InvocationHandler {  
  2.     private Object target;  
  3.   
  4.     MyInvocationHandler() {  
  5.         super();  
  6.     }  
  7.   
  8.     MyInvocationHandler(Object target) {  
  9.         super();  
  10.         this.target = target;  
  11.     }  
  12.   
  13.     @Override  
  14.     public Object invoke(Object o, Method method, Object[] args) throws Throwable {  
  15.         if("getName".equals(method.getName())){  
  16.             System.out.println("++++++before " + method.getName() + "++++++");  
  17.             Object result = method.invoke(target, args);  
  18.             System.out.println("++++++after " + method.getName() + "++++++");  
  19.             return result;  
  20.         }else{  
  21.             Object result = method.invoke(target, args);  
  22.             return result;  
  23.         }  
  24.   
  25.     }  
  26. }  
再new一个proxy:

  1. public class Main1 {  
  2.     public static void main(String[] args) {  
  3.         UserService userService = new UserServiceImpl();  
  4.         InvocationHandler invocationHandler = new MyInvocationHandler(userService);  
  5.         UserService userServiceProxy = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),  
  6.                 userService.getClass().getInterfaces(), invocationHandler);  
  7.         System.out.println(userServiceProxy.getName(1));  
  8.         System.out.println(userServiceProxy.getAge(1));  
  9.     }  
原理分析:你既然要我在某个对象的方法A执行前后做些事情,那么你实际调用该对象时,不能直接让你调用,要让你调用我生成的代理PROXY类,这个类有哪些方法由第二个参数决定,这个新生成的类由哪个加载器来加载由第一个参数决定,那么要在这个方法前后做什么事情由最后一个参数决定。 注意:JDK代理也是要动态生成字节码的,就是这个proxy类


 

l  advice是你想向别的程序内部不同的地方注入的代码。pointcut定义了需要注入advice的位置,通常是某个特定的类的一个public方法。advisorpointcutadvice的装配器,是将advice注入主程序中预定义位置的代码。

l  SPRING在对方法进行事务控制时,如果方法A调用了本类的方法B,那方法B的事务配置是不起作用的。如方法B是独立事务,在方法A中调用它时,它并不会作为独立事务提交。

l  使用autowire属性可以实现自动注入,可以取值:byNamebyType

l  首先要搞清楚byte是什么含义,byte就是字节单位、那么,一个字节又又8位二进制表示,西方字符一般用1个字节也就是一个8位的二进制来表示,一个中国汉字一般用2个字节也就是16位的二进制表示。1 byte=8 bit

l  输入输出流

l  单点登陆

l  CGLIB的例子

l  TPS: TPSTransactionsPerSecond的缩写,也就是事务数/秒。它是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数,最终利用这些信息来估计 得分。客户机使用加权协函数平均方法来计算客户机的得分,测试软件就是利用客户机的这些信息使用加权协函数平均方法来计算服务器端的整体TPS得分

l  MULEOSGI数据库连接池、mavenMINA

l  SOCKET是基于传输层的协议。通过Socket的数据表现形式为字节流信息,因此通讯双方要想完成某项具体的应用则必须按双方约定的方式进行数据的格式化和解释。一般服务端要循环检测是否有客户连接到服务器上,如果有,则创建一个线程来服务这个客户,这个线程的名称是ServerThread,这个类扩展了Thread类。在服务器以及客户端各建立一个独立的线程来察看输入流,如果输入流中有输入,则作相应的动作。NIO 的非阻塞 I/O 机制是围绕 选择器和 通道构建的.

SOCKET分为长连接和短连接。长连接在一次连接的基础上可发多次交互,短连接则是一次连接一次交互。在使用长连接时为保证TCP连接正常,需要在应用层制定协议,发心跳包。

APACHEMINA包是对SOCKET的包装,采用反应器模式,即非阻塞式地处理。有一个分发器负责接受所有的请求,根据事件处理器在分发器中注册的CHANNEL及事件,当对应的CHANNEL有请求时,会分发到对应的处理器进行处理

l  JAVA采用沙箱机制来实现安全,不同类装载器之间的类不可以直接访问.CLASSLODER是一个父子关系的树,加载类的时候会先用父加载。防止冒充的代码运行。

1)   一个CLASSLOADER接受到加载一个类的请求时,会先向父类询问是否已经加载该类,这样的话,类似于JAVA API中的类就不会被冒充加载了,因为JVM顶层的CLASSLOADER是启动类加载器,加载JAVA API的。

2)   即使绕过了上面的限制,比如一个自定义类加载器加载了一个java.lang.Virus的类,它也不能访问JAVA API中的java.lang包的其他类,因为JAVA沙箱只允许同一个运行时包内的类互访,即同一个包,并由同一个类加载器加载的才叫同一个运行时包。

l  可以定义自己的Annotation,在使用的时候原理是通过反射得到类或方法上对应的Annotation,从而进行相应的处理。

l  SSL协议中公私钥通常用来加密对称加密算法,真正传输的内容是由对称加密算法来加密的。

       TCP/IP 要求通讯的双方通风器建立连接再通讯,而UDP方式则不事先建立连接而直接发送。

l   SESSION和浏览器的关系:在谈论session机制的时候,常常听到这样一种误解只要关闭浏览器,session就消失了。其实可以想象一下会员卡的例子,除非顾客主动对店家提出销卡,否则店家绝对不会轻易删除顾客的资料。对session来说也是一样的,除非程序通知服务器删除一个session,否则服务器会一直保留,程序一般都是在用户做log off的时候发个指令去删除session。然而浏览器从来不会主动在关闭之前通知服务器它将要关闭,因此服务器根本不会有机会知道浏览器已经关闭,之所以会有这种错觉,是大部分session机制都使用会话cookie来保存session id,而关闭浏览器后这个 session id就消失了,再次连接服务器时也就无法找到原来的session。如果服务器设置的cookie被保存到硬盘上,或者使用某种手段改写浏览器发出的HTTP请求头,把原来的session id发送给服务器,则再次打开浏览器仍然能够找到原来的session 

l  JAVA代码中使用groovy可能会引起性能问题

       BIOBIO:

你可能感兴趣的:(java)