代码块和静态代码块;@Bean@Resource;

 代码块和静态代码块

类中代码块的使用、属性赋值顺序(补充) - 萧若風 - 博客园

静态代码块:

随着类的加载而执行,而且只执行一次;

作用:初始化类的信息,包括类静态属性

如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行;

静态代码块的执行要优先于非静态代码块的执行;

静态代码块内只能调用静态的属性、方法,不能调用非静态的结构。

非静态代码块:

随着对象的创建而执行,每创建一个对象,就执行一次非静态代码块;

作用:可以在创建对象时,对该对象的属性等进行初始化

如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行;

非静态代码块内可以调用静态的属性、方法,或非静态的属性、方法。

属性赋值的先后顺序:

① 默认 / 隐式初始化

② 在静态/非静态代码块中赋值

③ 构造器中初始化(默认无参构造器是隐式初始化,重载的构造方法为显式初始化)

④ 创建对象后通过对象.属性(静态属性) 或 对象.方法(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")
private static RestHighLevelClient 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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值