代码块和静态代码块
类中代码块的使用、属性赋值顺序(补充) - 萧若風 - 博客园
静态代码块:
随着类的加载而执行,而且只执行一次;
作用:初始化类的信息,包括类静态属性;
如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行;
静态代码块的执行要优先于非静态代码块的执行;
静态代码块内只能调用静态的属性、方法,不能调用非静态的结构。
非静态代码块:
随着对象的创建而执行,每创建一个对象,就执行一次非静态代码块;
作用:可以在创建对象时,对该对象的属性等进行初始化;
如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行;
非静态代码块内可以调用静态的属性、方法,或非静态的属性、方法。
属性赋值的先后顺序:
① 默认 / 隐式初始化
② 在静态/非静态代码块中赋值
③ 构造器中初始化(默认无参构造器是隐式初始化,重载的构造方法为显式初始化)
④ 创建对象后通过“对象.属性(静态属性)” 或 “对象.方法(set方法)” 进行赋值
@Bean@Resource
自定义Bean :
@Configuration
public class Config {
@Bean(name = {"rhlc", "rhlClient"})//bean的原名为方法名:restHighLevelClient,定义别名为:rhlc/rhlclient
@Description("定义别名后,原名就不可用了")
public RestHighLevelClient restHighLevelClient() {
//如果有多个从节点可以持续在内部new多个HttpHost,参数1是IP,参数2是端口,参数3是通信协议
System.out.println("进入自定义bean...");
return new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
}
}
不能注入到静态属性当中否则会空指针 :
@Resource(name = "rhlClient")
privatestaticRestHighLevelClient restHighLevelClient;//不能注入到静态属性当中
可以在静态代码块中用getBean()方法获取bean给静态属性赋值:
private static RestHighLevelClient restHighLevelClient;
static {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
RestHighLevelClient restHighLevelClient1 = context.getBean("rhlClient", RestHighLevelClient.class);
restHighLevelClient = restHighLevelClient1;
//this.restHighLevelClient = restHighLevelClient1;//不能在静态结构中用this关键字
}
在@PostConstruct注解标注的方法中不能用getBean()方法获取bean达到给静态属性赋值的目的,因为getBean()在初始化之后才可获取到bean,@PostConstruct注解标注的方法属于初始化的一步。不能这样:
private static RestHighLevelClient restHighLevelClient; @PostConstruct public void init(){ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); RestHighLevelClient restHighLevelClient1 = context.getBean("rhlClient", RestHighLevelClient.class); this.restHighLevelClient = restHighLevelClient1; }
也可以 不采用自定义Bean的方式实现代码解耦,可以使用lambda表达式的方式实现代码重用:
https://blog.csdn.net/qq_43542296/article/details/117988394