以下代码用于Spring - Hibernate Full Java Based Configuration在很多地方(如here):
Properties hibernateProperties() {
return new Properties() {
{
setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
setProperty("hibernate.show_sql", "true");
setProperty("hibernate.format_sql", "true");
setProperty("use_sql_comments", "true");
setProperty("hibernate.hbm2ddl.auto", "none");
}
};
}
这是一个类中的方法。我认为返回对象是一个匿名类对象(请告诉我,如果我错了)。括起setProperty语句的大括号是什么?那是一个阵列吗?如果是这样的话,那里不应该有任何分号?
我无法找到解释此语法的任何地方。请提供一些详细解释的链接。
答案 0 :(得分:0)
这是一个返回Properties
类型对象的方法。该方法创建一个anonymous class,它定义了一个实例initializer block,它在返回的对象中设置了一些属性:
return new Properties() {
// this is an instance initializer block which pre-sets some properties
{
setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
setProperty("hibernate.show_sql", "true");
setProperty("hibernate.format_sql", "true");
setProperty("use_sql_comments", "true");
setProperty("hibernate.hbm2ddl.auto", "none");
}
};
它创建一个具有预定义属性的Properties
对象。
答案 1 :(得分:0)
类中可以包含initialization blocks(静态和非静态)。在非静态块的情况下,它们的代码将在类的每个构造函数的开头移动(实际上几乎在开始时因为它将在显式或隐式super()
调用之后立即放置)。
所以类似
class Foo{
void method(){
System.out.println("method()");
}
Foo(){
System.out.println("constructor of Foo");
}
{
System.out.println("initialization block");
method();
}
public static void main(String[] args) {
Foo f = new Foo();
}
}
与
相同class Foo {
void method() {
System.out.println("method()");
}
Foo() {
super();
//initialization block is moved here
{
System.out.println("initialization block");
method();
}
System.out.println("constructor of Foo");
}
public static void main(String[] args) {
Foo f = new Foo();
}
}
因此,在这个初始化块中,您可以调用Foo
类的任何方法,就像您可以在构造函数中调用它们一样。