java8的Supplier
參考:
java.util.function.Supplier
定義
supplier也是是用來創建對象的,但是不同於傳統的創建對象語法:new,每次調用get()方法時都會調用構造方法創建一個新對象。
public class TestSupplier {
private int age;
TestSupplier(){
System.out.println(age);
}
public static void main(String[] args) {
//創建Supplier容器,聲明為TestSupplier類型,此時並不會調用對象的構造方法,即不會創建對象
Supplier<TestSupplier> sup= TestSupplier::new;
System.out.println("--------");
//調用get()方法,此時會調用對象的構造方法,即獲得到真正對象
sup.get();
//每次get都會調用構造方法,即獲取的對象不同
sup.get();
}
}
輸出結果:
--------
0
0
源碼
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
案例
類似多例調用
@Bean
public Supplier<User> hbaseConnSupplier() {
return () -> {
User user = new User((int) (Math.random() * 1000));
System.out.println("調用了hbaseConnSupplier,User:id:" + user.getId());
return user;
};
}
controller調用
@Autowired
private Supplier<User> hbaseConnSupplier;
@RequestMapping("/test2")
public void test2(){
User user = hbaseConnSupplier.get();
System.out.println("test2:user:id:"+ user.getId());
System.out.println("test2:user:id2:"+ user.getId());
user=hbaseConnSupplier.get();
System.out.println("test2:user:id3:"+ user.getId());
System.out.println("----------------------");
}
輸出
調用了hbaseConnSupplier,User:id:286
test2:user:id:286
test2:user:id2:286
調用了hbaseConnSupplier,User:id:13
test2:user:id3:13
----------------------
每次調用get方法都獲取一個新的User
