淺談spring ioc的注入方式及注入不同的數(shù)據(jù)類型
關(guān)于Spring-IoC的簡(jiǎn)單使用參考:
spring ioc的簡(jiǎn)單實(shí)例及bean的作用域?qū)傩越馕?/strong>
1、通過(guò)set方法注入不同數(shù)據(jù)類型
測(cè)試類代碼(set方式注入的屬性一定要加set方法)
/**通過(guò)set方法注入示例*/
public class IoC_By_Set {
/**注入Integer類型參數(shù)*/
private Integer id;
/**注入String類型參數(shù)*/
private String name;
/**注入實(shí)體Bean*/
private User user;
/**注入數(shù)組*/
private Object[] array;
/**注入List集合*/
private List<Object> list;
/**注入Set集合*/
private Set<Object> set;
/**注入Map鍵值對(duì)*/
private Map<Object, Object> map;
/**注入properties類型*/
private Properties properties;
/**注入空字符串*/
private String emptyValue;
/**注入null值*/
private String nullValue = "";
/**檢測(cè)注入的屬性是否全部正確*/
public Boolean checkAttr() {
if(id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("--------------------------");
if(name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("--------------------------");
if(user == null) {
return false;
} else {
System.out.println("Bean:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("--------------------------");
if(array == null) {
return false;
} else {
System.out.println("array:");
for (Object object : array) {
System.out.println(object.toString());
}
}
System.out.println("--------------------------");
if(list == null) {
return false;
} else {
System.out.println("list:");
for (Object object : list) {
System.out.println(object.toString());
}
}
System.out.println("--------------------------");
if(set == null) {
return false;
} else {
System.out.println("set:");
for (Object object : set) {
System.out.println(object.toString());
}
}
System.out.println("--------------------------");
if(map == null) {
return false;
} else {
Set<Entry<Object, Object>> set = map.entrySet();
System.out.println("map:");
for (Entry<Object, Object> entry : set) {
System.out.println(entry.getKey() + "|" + entry.getValue());
}
}
System.out.println("--------------------------");
if(properties == null) {
return false;
} else {
Set<Entry<Object, Object>> set = properties.entrySet();
System.out.println("properties:");
for (Entry<Object, Object> entry : set) {
System.out.println(entry.getKey() + "|" + entry.getValue());
}
}
System.out.println("--------------------------");
if(!"".equals(emptyValue))
return false;
System.out.println("--------------------------");
if(!(null == nullValue))
return false;
System.out.println("--------------------------");
System.out.println("全部正確?。?!");
return true;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setUser(User user) {
this.user = user;
}
public void setArray(Object[] array) {
this.array = array;
}
public void setList(List<Object> list) {
this.list = list;
}
public void setSet(Set<Object> set) {
this.set = set;
}
public void setMap(Map<Object, Object> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void setEmptyValue(String emptyValue) {
this.emptyValue = emptyValue;
}
public void setNullValue(String nullValue) {
this.nullValue = nullValue;
}
}
applicationContext.xml配置
<!-- set方式注入 -->
<bean id="ioC_By_Set" class="com.bc.ioc.demo01.IoC_By_Set">
<!-- 注入id屬性 -->
<property name="id" value="1"/>
<!-- 使用<![CDATA[]]>標(biāo)記處理XML特 殊字符 -->
<property name="name">
<!-- 也可以使用P&G -->
<value><![CDATA[P&G]]></value>
</property>
<!-- 定義內(nèi)部Bean注入 -->
<property name="user">
<bean class="com.bc.pojo.User">
<property name="id" value="1"/>
<property name="userName" value="內(nèi)部Bean"/>
<property name="passWord" value="233"/>
</bean>
</property>
<!-- 注入數(shù)組類型 -->
<property name="array">
<array>
<!-- 定義數(shù)組元素 -->
<value>array01</value>
<value>array02</value>
<value>array03</value>
</array>
</property>
<!-- 注入List類型 -->
<property name="list">
<list>
<!-- 定義list中元素 -->
<value>list01</value>
<value>list02</value>
<value>list03</value>
</list>
</property>
<!-- 注入Set類型 -->
<property name="set">
<set>
<!-- 定義set中元素 -->
<value>set01</value>
<value>set02</value>
<value>set03</value>
</set>
</property>
<!-- 注入Map類型 -->
<property name="map">
<map>
<!-- 定義map中的鍵值對(duì) -->
<entry>
<key>
<value>mapKey01</value>
</key>
<value>mapValue01</value>
</entry>
<entry>
<key>
<value>mapKey02</value>
</key>
<value>mapValue02</value>
</entry>
</map>
</property>
<!-- 注入properties類型 -->
<property name="properties">
<props>
<!-- 定義properties中的鍵值對(duì) -->
<prop key="propKey1">propValue1</prop>
<prop key="propKey2">propValue2</prop>
</props>
</property>
<!-- 注入空字符串 -->
<property name="emptyValue">
<value></value>
</property>
<!-- 注入null值 -->
<property name="nullValue">
<null/>
</property>
</bean>
測(cè)試代碼
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//讀取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void SetTest() {
IoC_By_Set ioc = (IoC_By_Set) ctx.getBean("ioC_By_Set");
ioc.checkAttr();
}
}
控制臺(tái)結(jié)果:
id:1 -------------------------- name:P&G -------------------------- Bean:1|內(nèi)部Bean|233 -------------------------- array: array01 array02 array03 -------------------------- list: list01 list02 list03 -------------------------- set: set01 set02 set03 -------------------------- map: mapKey01|mapValue01 mapKey02|mapValue02 -------------------------- properties: propKey2|propValue2 propKey1|propValue1 -------------------------- -------------------------- -------------------------- 全部正確!??!
2、通過(guò)構(gòu)造方法注入各種類型屬性
注意:使用JDK1.8版本請(qǐng)將spring相關(guān)jar包升級(jí)到4.x版本以上,否則不兼容構(gòu)造方法注入
測(cè)試類代碼
/** 通過(guò)構(gòu)造方法注入示例 */
public class IoC_By_Constructor {
private Integer id;
private String name;
private User user;
private List<Object> list;
public IoC_By_Constructor() {
}
public IoC_By_Constructor(Integer id, String name, User user,
List<Object> list) {
this.id = id;
this.name = name;
this.user = user;
this.list = list;
}
/**檢查是否注入成功*/
public Boolean checkAttr() {
if(id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("----------------------------");
if(name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("----------------------------");
if(user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("----------------------------");
if(list == null) {
return false;
} else {
System.out.println("list:");
for (Object object : list) {
System.out.println(object.toString());
}
}
System.out.println("----------------------------");
System.out.println("全部正確!??!");
return true;
}
}
applicationContext.xml配置
<!-- 構(gòu)造方法注入 演示幾種類型-->
<bean id="ioC_By_Constructor" class="com.bc.ioc.demo02.IoC_By_Constructor">
<!-- 注入Integer屬性,可以選擇使用index指定參數(shù)位置,也可以選擇使用type指定參數(shù)類型 -->
<constructor-arg index="0" value="1" type="java.lang.Integer"/>
<!-- 注入字符串 -->
<constructor-arg value="P&G"/>
<!-- 注入對(duì)象 -->
<constructor-arg>
<!-- 內(nèi)建對(duì)象 -->
<bean class="com.bc.pojo.User">
<constructor-arg value="1"/>
<constructor-arg value="構(gòu)造內(nèi)部Bean"/>
<constructor-arg value="666"/>
</bean>
</constructor-arg>
<!-- 注入集合 -->
<constructor-arg>
<list>
<value>list01</value>
<value>list02</value>
<value>list03</value>
</list>
</constructor-arg>
</bean>
測(cè)試代碼:
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//讀取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void constructorTest() {
IoC_By_Constructor ioc = (IoC_By_Constructor) ctx.getBean("ioC_By_Constructor");
ioc.checkAttr();
}
}
控制臺(tái)結(jié)果:
id:1 ---------------------------- name:P&G ---------------------------- user:1|構(gòu)造內(nèi)部Bean|666 ---------------------------- list: list01 list02 list03 ---------------------------- 全部正確?。?!
3、自動(dòng)注入(自動(dòng)裝配)
自動(dòng)裝配雖然能節(jié)省一些代碼但是不推薦使用
測(cè)試類代碼:
/**自動(dòng)裝配注入*/
public class IoC_By_Auto {
private User user;
/**檢查是否注入成功*/
public Boolean checkAttr() {
if(user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("正確?。?!");
return true;
}
/**自動(dòng)裝配的屬性需要設(shè)置set方法*/
public void setUser(User user) {
this.user = user;
}
}
applicationContext.xml配置
<!-- 被自動(dòng)裝配獲取的bean -->
<bean id="user" class="com.bc.pojo.User">
<property name="id" value="1"/>
<property name="userName" value="自動(dòng)裝配"/>
<property name="passWord" value="233"/>
</bean>
<!-- 自動(dòng)裝配的bean
autowire:byName 根據(jù)類的屬性名查找與之命名相同的id的bean進(jìn)行裝配
byType 根據(jù)類的屬性類型查找唯一一個(gè)匹配類型的bean,如果有多個(gè)bean匹配則拋出異常
constructor 根據(jù)類的構(gòu)造方法參數(shù)類型匹配對(duì)應(yīng)的bean
no 默認(rèn),表示不使用自動(dòng)裝配
default:由上級(jí)標(biāo)簽<beans>的default-autowire屬性確定 -->
<bean id="ioC_By_Auto" class="com.bc.ioc.demo03.IoC_By_Auto" autowire="byName"></bean>
測(cè)試代碼
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//讀取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void AutoTest() {
IoC_By_Auto ioc = (IoC_By_Auto) ctx.getBean("ioC_By_Auto");
ioc.checkAttr();
}
}
控制臺(tái)結(jié)果
user:1|自動(dòng)裝配|233 正確?。。?/pre>
以上使用的是byName模式,其他模式配置代碼已經(jīng)注明,不做測(cè)試。
4、使用P命名空間注入屬性
測(cè)試類代碼
/**使用P命名空間注入*/
public class IoC_By_P {
private Integer id;
private String name;
private User user;
/**檢查是否注入成功*/
public Boolean checkAttr() {
if(id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("----------------------------");
if(name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("----------------------------");
if(user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("----------------------------");
System.out.println("全部正確?。。?);
return true;
}
//使用P命名空間注入屬性需要設(shè)置set方法
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setUser(User user) {
this.user = user;
}
}
applicationContext.xml配置
<!-- 使用P命名空間注入各種類型屬性 -->
<bean id="user2" class="com.bc.pojo.User">
<property name="id" value="1"/>
<property name="userName" value="P"/>
<property name="passWord" value="233"/>
</bean>
<bean id="ioC_By_P" class="com.bc.ioc.demo04.IoC_By_P" p:id="1"
p:name="命名空間" p:user-ref="user2"></bean>
測(cè)試代碼
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//讀取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void PTest() {
IoC_By_P ioc = (IoC_By_P) ctx.getBean("ioC_By_P");
ioc.checkAttr();
}
}
控制臺(tái)結(jié)果
id:1 ---------------------------- name:命名空間 ---------------------------- user:1|P|233 ---------------------------- 全部正確?。。?/pre>
5、使用注解方式注入
Spring在3.0以后,提供了基于Annotation(注解)的注入。
1.@Autowired-對(duì)成員變量、方法和構(gòu)造函數(shù)進(jìn)行標(biāo)注,來(lái)完成自動(dòng)裝配的工作,不推薦使用
2.@Qualifier-配合@Autowired來(lái)解決裝配多個(gè)同類型的bean
3.@Resource-JSR-250標(biāo)準(zhǔn)注解,作用相當(dāng)于@Autowired,只不過(guò)@Autowired按byType自動(dòng)注入,而@Resource默認(rèn)按byName自動(dòng)注入
4.@PostConstruct-在方法上加上注解@PostConstruct,這個(gè)方法就會(huì)在Bean初始化之后被Spring容器執(zhí)行
5.@PreDestroy-在方法上加上注解@PreDestroy,這個(gè)方法就會(huì)在Bean初始化之后被Spring容器執(zhí)行
6.@Component-只需要在對(duì)應(yīng)的類上加上一個(gè)@Component注解,就將該類定義為一個(gè)Bean,不推薦使用,推薦使用更加細(xì)化的三種:@Repository、@Service、@Controller
@Repository存儲(chǔ)層Bean
@Service業(yè)務(wù)層Bean
@Controller展示層Bean
7.@Scope-定義Bean的作用范圍
首先配置applicationContext.xml開啟注解
<!-- 掃描包中注解標(biāo)注的類 --> <context:component-scan base-package="com.bc.ioc.demo05"/>
實(shí)體Bean加注解
@Repository
public class User {
private Integer id = 1;
private String userName = "注解注入";
private String passWord = "233";
public User() {
super();
}
public User(Integer id, String userName, String passWord) {
super();
this.id = id;
this.userName = userName;
this.passWord = passWord;
}
public Integer getId() {
return id;
}
public String getUserName() {
return userName;
}
public String getPassWord() {
return passWord;
}
public void setId(Integer id) {
this.id = id;
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
測(cè)試類代碼加注解
/**使用注解注入屬性*/
@Service("ioC_By_Annotation")
public class IoC_By_Annotation {
@Resource
private User user;
public void setUser(User user) {
this.user = user;
}
/**檢查是否注入成功*/
public Boolean checkAttr() {
if(user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|" +
user.getUserName() + "|" + user.getPassWord());
}
System.out.println("正確!?。?);
return true;
}
}
測(cè)試代碼
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//讀取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void annotationTest() {
IoC_By_Annotation ioc = (IoC_By_Annotation) ctx.getBean("ioC_By_Annotation");
ioc.checkAttr();
}
}
控制臺(tái)輸出
經(jīng)測(cè)試使用注解注入如果applicationContext.xml配置有其他注入方式會(huì)報(bào)錯(cuò),也會(huì)導(dǎo)致其他注入方式異常。
user:1|注解注入|233 正確?。?!
6、通過(guò)配置靜態(tài)工廠方法Bean注入
靜態(tài)工廠代碼
/**靜態(tài)工廠*/
public class StaticFactory {
public static Integer getId() {
return 1;
}
public static String getName() {
return "靜態(tài)工廠";
}
public static User getUser() {
return new User(1, "工廠User", "666");
}
}
測(cè)試類代碼
/** 通過(guò)靜態(tài)工廠方式注入 */
public class IoC_By_StaticFactory {
private Integer id;
private String name;
private User user;
/** 檢查是否注入成功 */
public Boolean checkAttr() {
if (id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("----------------------------");
if (name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("----------------------------");
if (user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|"
+ user.getUserName() + "|" + user.getPassWord());
}
System.out.println("----------------------------");
System.out.println("全部正確?。?!");
return true;
}
/**需要為需要注入的屬性設(shè)置set方法*/
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setUser(User user) {
this.user = user;
}
}
applicationContext.xml配置
<!-- 配置靜態(tài)工廠方法Bean 其實(shí)就是將工廠方法返回的數(shù)值配置成Bean -->
<bean id="factory_id" class="com.bc.ioc.demo06.StaticFactory" factory-method="getId"/>
<bean id="factory_name" class="com.bc.ioc.demo06.StaticFactory" factory-method="getName"/>
<bean id="factory_user" class="com.bc.ioc.demo06.StaticFactory" factory-method="getUser"/>
<!-- 注入對(duì)應(yīng)的靜態(tài)工廠方法Bean -->
<bean id="ioC_By_StaticFactory" class="com.bc.ioc.demo06.IoC_By_StaticFactory">
<property name="id" ref="factory_id"/>
<property name="name" ref="factory_name"/>
<property name="user" ref="factory_user"/>
</bean>
測(cè)試代碼
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//讀取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void staticFactoryTest() {
IoC_By_StaticFactory ioc = (IoC_By_StaticFactory) ctx.getBean("ioC_By_StaticFactory");
ioc.checkAttr();
}
}
控制臺(tái)輸出結(jié)果
id:1 ---------------------------- name:靜態(tài)工廠 ---------------------------- user:1|工廠User|666 ---------------------------- 全部正確!??!
7、通過(guò)實(shí)例工廠方法注入
與靜態(tài)工廠區(qū)別在于實(shí)例工廠不是靜態(tài)的,需要先new 一個(gè)實(shí)例工廠對(duì)象,才可以配置其方法,而new 的這個(gè)對(duì)象也由spring來(lái)管理
工廠代碼
/**實(shí)例工廠*/
public class Factory {
public Integer getId() {
return 1;
}
public String getName() {
return "實(shí)例工廠";
}
public User getUser() {
return new User(1, "實(shí)例工廠User", "233");
}
}
測(cè)試類代碼
/**實(shí)例工廠注入*/
public class IoC_By_Factory {
private Integer id;
private String name;
private User user;
/** 檢查是否注入成功 */
public Boolean checkAttr() {
if (id == null) {
return false;
} else {
System.out.println("id:" + id);
}
System.out.println("----------------------------");
if (name == null) {
return false;
} else {
System.out.println("name:" + name);
}
System.out.println("----------------------------");
if (user == null) {
return false;
} else {
System.out.println("user:" + user.getId() + "|"
+ user.getUserName() + "|" + user.getPassWord());
}
System.out.println("----------------------------");
System.out.println("全部正確!?。?);
return true;
}
/**需要為需要注入的屬性設(shè)置set方法*/
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public void setUser(User user) {
this.user = user;
}
}
applicationContext.xml配置
<!-- 配置實(shí)例工廠Bean -->
<bean id="factory" class="com.bc.ioc.demo07.Factory"/>
<!-- 配置實(shí)例工廠方法Bean -->
<bean id="f_id" factory-bean="factory" factory-method="getId"/>
<bean id="f_name" factory-bean="factory" factory-method="getName"/>
<bean id="f_user" factory-bean="factory" factory-method="getUser"/>
<!-- 注入對(duì)應(yīng)的實(shí)例工廠方法Bean -->
<bean id="ioC_By_Factory" class="com.bc.ioc.demo07.IoC_By_Factory">
<property name="id" ref="f_id"/>
<property name="name" ref="f_name"/>
<property name="user" ref="f_user"/>
</bean>
測(cè)試類代碼
public class IoC_Test {
private ApplicationContext ctx;
@Before
public void load() {
//讀取applicationContext.xml配置文件
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void factoryTest() {
IoC_By_Factory ioc = (IoC_By_Factory) ctx.getBean("ioC_By_Factory");
ioc.checkAttr();
}
}
控制臺(tái)輸出
id:1 ---------------------------- name:實(shí)例工廠 ---------------------------- user:1|實(shí)例工廠User|233 ---------------------------- 全部正確?。?!
總結(jié)
以上就是本文關(guān)于淺談spring ioc的注入方式及注入不同的數(shù)據(jù)類型的全部?jī)?nèi)容,希望對(duì)大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!
- Spring IOC和DI實(shí)現(xiàn)原理及實(shí)例解析
- SpringIOC DI循環(huán)依賴實(shí)例詳解
- 創(chuàng)建Maven項(xiàng)目和Spring IOC實(shí)例過(guò)程解析
- Spring IOC和aop的原理及實(shí)例詳解
- Spring為IOC容器注入Bean的五種方式詳解
- 簡(jiǎn)單了解SPRINGIOC的底層原理演變過(guò)程
- 關(guān)于SpringBoot獲取IOC容器中注入的Bean(推薦)
- 淺談Spring IoC容器的依賴注入原理
- 簡(jiǎn)單實(shí)現(xiàn)Spring的IOC原理詳解
- Spring IOC原理詳解
- 模仿Spring手寫一個(gè)簡(jiǎn)易的IOC
相關(guān)文章
SpringMVC實(shí)現(xiàn)參數(shù)校驗(yàn)配置方法
這篇文章主要介紹了SpringMVC實(shí)現(xiàn)參數(shù)校驗(yàn)的配置方式,Spring MVC會(huì)拋出MethodArgumentNotValidException異常,并將錯(cuò)誤信息綁定到相應(yīng)的字段上,感興趣的朋友跟隨小編一起看看吧2024-03-03
SpringBoot如何進(jìn)行對(duì)象復(fù)制的實(shí)踐
本文主要介紹了SpringBoot 如何進(jìn)行對(duì)象復(fù)制,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換
這篇文章主要介紹了詳解SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
SpringCloud Netfilx Ribbon負(fù)載均衡工具使用方法介紹
Ribbon是Netflix的組件之一,負(fù)責(zé)注冊(cè)中心的負(fù)載均衡,有助于控制HTTP和TCP客戶端行為。Spring Cloud Netflix Ribbon一般配合Ribbon進(jìn)行使用,利用在Eureka中讀取的服務(wù)信息,在調(diào)用服務(wù)節(jié)點(diǎn)時(shí)合理進(jìn)行負(fù)載2022-12-12
SpringBoot中@Scheduled實(shí)現(xiàn)服務(wù)啟動(dòng)時(shí)執(zhí)行一次
Spring?Boot使用線程池處理上萬(wàn)條數(shù)據(jù)插入功能

