有关虚拟机的学习已在近期计划中,书籍已买,但尚未进行.今天准备研读spring的事务相关源码,随即复习了一下相关知识.看到一位前辈在github上的代码,非常有意思,特记下笔记,以供学习和后期复习:
public class DataSourceFactory { private static final BasicDataSource dataSource = new BasicDataSource(); static { dataSource.setDriverClassName("org.hsqldb.jdbcDriver"); dataSource.setUsername("SA"); dataSource.setPassword(""); dataSource.setUrl("jdbc:hsqldb:mem:bank"); } public static DataSource createDataSource() { return dataSource; } }
以上为相关代码,写法可以优化,比如讲数据库连接参数写到配置文件里.
但我想记录的是:
这里利用了虚拟机加载类的先后顺序和特性:虚拟机加载类的时候,@1.先加载该类的静态常量和变量(静态常量和变量按顺序加载),@2.然后加载静态代码块,@3.最后再加载其它部分。
而且,静态常量和静态代码块只在加载类的时候执行一次,new 新的对象的时候不再执行.
因此,此处代码 在加载的时候,直接将参数一起加载了,其它类 直接调用该类的 createDataSource()方法,即可获取数据库连接对象;
以下是我写的一个简单的demo,来印证以上描述:
public class StaticTest { public static final a btest= new a("btest"); public static a atest= new a("atest"); static { System.out.println("I AM STATICS'S CODE"); } public static void main(String [] args){ StaticTest staticTest =new StaticTest(); staticTest.test(); StaticTest staticTest1 = new StaticTest(); staticTest1.test(); } public void test (){ System.out.println("I AM NOT STATICS'S CODE"); } static class a{ a(String a){ System.out.println(a); } } }
以上为demo代码,
以下为执行输出内容:
btest
atest
I AM STATICS'S CODE
I AM NOT STATICS'S CODE
I AM NOT STATICS'S CODE
,无论新建该类的多少个对象,该类的 静态变量和静态常量还有静态代码块只执行一次.
不得不感叹的是:灵活运用是王道!
至于更底层的内容下一阶段学习虚拟机相关知识将会涉及,此处先略过.