java知识库
1、加载配置文件
classpath:spring/springmvc.xml
classpath*:spring/springmvc.xml
两者的区别在于前者只加载本项目下的配置文件,而后者还会加载“添加的jar包”中的配置文件。
2、动态代理
备注:参考项目ProxyTanSuo
2.1 JDK动态代理
代理类要实现InvocationHandler接口,实现它的invoke()方法,利用形参Method对象的回调方法--invoke()方法来实现代理。
2.2 Cglib动态代理
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢?,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。
性能分析:CGLib创建的动态代理对象性能比JDK创建的动态代理对象的性能高不少,但是CGLib在创建代理对象时所花费的时间却比JDK多得多,所以对于单例的对象,因为无需频繁创建对象,用CGLib合适,反之,使用JDK方式要更为合适一些。同时,由于CGLib由于是采用动态创建子类的方法,对于final方法,无法进行代理。
注意:要导入两个jar包--cglib.jar和asm.jar;由于很多java字节码操作和分析的第三方类库都引用了asm.jar文件,所以需要导入它;
缺少asm.jar会导致以下异常:java.lang.NoClassDefFoundError:org/objectweb/asm/Type
3、注解
备注:参考项目Annotation&Enum_TanSuo
3.1 常用注解
@Target(value={ElementType.TYPE,ElementType.METHOD}),此注解用于指定注解可以支持的范围,例如ElementType.TYPE--类,ElementType.METHOD--方法;
@Retention(value=RetentionPolicy.RUNTIME),此注解用于指定注解存在的范围。只有设置成RUNTIME,注解才可以在运行时被获取到。默认是CLASS;
@Documented(未弄清楚)
被@Documented修饰的注解会生成到javadoc中
@Inherited
此注解用于指定被修饰的注解能否被继承
3.2 自定义注解
4、枚举类型
备注:参考项目Annotation&Enum_TanSuo
枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。 在JDK1.5之前,我们定义常量都是:public static fianl....。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。
总结:枚举的本质是类,在没有枚举之前,仍然可以按照java最基本的编程手段来解决需要用到枚举的地方。枚举屏蔽了枚举值的类型信息,不像在用public static final定义变量必须指定类型。枚举是用来构建常量数据结构的模板,这个模板可扩展。枚举的使用增强了程序的健壮性,比如在引用一个不存在的枚举值的时候,编译器会报错。枚举的更多用法还需要在开发中去研究创造。
注意:枚举类中没有方法和属性,只有项,一般都是大写。定义的项的值就是其本身。
如果需要为项指定属性,那么就需要指定构造方法和getter、setter方法。
5、load-on-startup属性
相关概念:
1、load-on-startup元素标记容器是否在服务器启动的时候就加载这个servlet(实例化并调用其init()方法)。
2、它的值必须是一个整数,表示servlet应该被载入的顺序。当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
3、当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
4、正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
5、当值相同时,容器就会自己选择顺序来加载。
实例:
6、web.xml中的文件路径如果不加classpath,那么系统默认会去哪里找?
通过以上异常可以发现,系统会去ServletContext(Servlet上下文)找指定的文件,而ServletContext其实就是WebRoot,所以我们应该把文件放到WebRoot下面,系统回到这里寻找。当我们输出上下文的路径时,系统会输出项目的名称;
7、高内聚
8、扇入与扇出
9、decimal(18,2)
相关概念:
18代表精度(其实就是数字的个数,除了小数点),2代表小数位数;
decimal(a,b)
-->a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38。
b指定小数点右边可以存储的十进制数字的最大个数。小数位数必须是从 0 到 a之间的值。默认小数位数是 0。
a与b的差值最小为3,比如decimal(4,1)可以,但是decimal(4,2)却不行;
10、运算符优先级别
相关概念:
关系运算符:小于、大于、等于、大于等于、小于等于、不等于;
赋值运算符:基本的是“=”,它的优先级别低于其它的运算符,所以它往往是最后被读取;
算术运算符:+ - * / % ^ ! |x|;
-->其优先级别:3级(/ * %),4级(+ -);
逻辑运算符:NOT、AND、OR;
实例:
由高向低:()、!、算术运算符、关系运算符、逻辑运算符、赋值运算符;
11、"=="与"equals"的区别(*)
在java中,"=="比较存储位置,而"equals"其实也是比较存储位置。equals方法有Object类定义,有很多类如Integer和String都重写了方法,所以两者的equals方法的功能就不同了。Integer的equals方法是比较两者数值是否相等:
String的equals方法是比较两者字面上是否完全一样:
需要注意的实例:
example1:String a="abc"; String b="abc";
那么a==b将返回true。因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存一份,所以a和b指向的是同一个对象;
example2:String a=new String("abc"); String b=new String("abc");
那么a==b将返回false,此时a和b指向不同的对象。
String a="abc",是存在String pool里;
String a=new String("abc");是存在对象pool里;
这两者有区别,前者是简单类型,后者是对象类型。
12、String、StringBuffer、StringBuilder三者的区别
http://blog.csdn.net/qq_36128330/article/details/59123553
注意:
String是不可变类,所以是线程安全的;
所有不可变类都是线程安全的,线程安全的类不一定是不
可变类,如StringBuffer是可变类,它靠锁实现线程安全;
特别注意(自己总结的概念、小细节):
1、别名定义,如果两个包中有相同的类-->系统会抛出异常;
2、如果html中的两个表单名称及其中的元素名称都相同,当对同名的元素进行js调用时,系统会出错;
3、html中的img标签不能使用绝对路径;
4、在网页中调节图片大小的宽度时,图片高度也会随之改变;不过可以同时指定宽度和高度;
5、如果一个方法、属性或类上面写着许多不同的注解,那么这些注解都会被引用,注解之间也许会相互制约;如@Ignore和@Test注解同时出现,那么程序会使用Ignore注解;
6、spring框架中的global session为整个HTTP请求中,在作用域方面就是application;
7、hibernate映射文件中不能写schema="dbo";
8、id在苹果电脑上作为一个关键字,所以数据库中的字段别定义为id;
9、mybatis中驼峰命名规则不会自动映射;
10、八大基本数据类型有一个是boolean,不包含String;
11、final 类,无法被继承
final方法,无法被覆盖,重写
final变量,无法被修改
12、反射是什么:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
13、反射的作用:
1)在运行时判断任意一个对象所属的类。
2)在运行时判断任意一个类所具有的成员变量和方法。
3)在运行时任意调用一个对象的方法
4)在运行时构造任意一个类的对象
可以通过配置文件来动态配置和加载类,以实现软件工程理论里所提及的类与类,模块与模块之间的解耦。反射最经典的应用是spring框架。
14、泛型是什么:
泛型是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类,泛型一般是用来解决代码复用的问题。
15、泛型的作用:
保证类型安全;
消除类型转换,增强代码可读性,减少出错机会;
提升性能,无需装箱和拆箱;
实现了代码复用;
16、AOP是什么:
简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。
使用“横切”技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”
17、AOP的应用场景:
性能监测,访问控制,事务管理、缓存、对象池管理以及日志记录。
18、Ajax的格式:
$.ajax({
type:"get",
url:"test01.action",
data:$("#myform").serialize(),
async:true,
success:function(){
alert("dd");
}
});
19、java四大常用连接池:
c3p0、BoneCP、Proxool、DBCP
20、java中获取的毫秒数是当前时间与"1970-01-1 8:0:0"的时间差;
21、mysql数据库导出的SQL文件不能有任何改动,否则就导入时会出错;
但是你可以将字段名和表名的单引号去掉,这样就可以了。
22、分工的时候一定得按模块来分的,绝对不能把一个模块分给几个人一起开发,因为那样公共的代码接口不好写。就比如我和邓泽军一起写广告模块,有些功能我这边其实一起完成,但那是他的模块,我又不好写,有点小顾忌;而且我这边改动会影响他,导致开发效率降低。
23、做事之前一定要考虑是否有更简单的方式去实现要求,否则耗费的时间会很多。