Spring?IoC容器與Bean管理項(xiàng)目實(shí)踐指南
代碼結(jié)構(gòu)
spring01/
├── pom.xml
├── spring01.iml
└── src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── demo/
│ │ ├── bean/
│ │ │ ├── Demo.java
│ │ │ ├── Emp1.java
│ │ │ ├── Emp2.java
│ │ │ └── User.java
│ │ ├── dao/
│ │ │ ├── UserDao.java
│ │ │ └── impl/
│ │ │ ├── MysqlUserDaoImpl.java
│ │ │ └── OracleUserDaoImpl.java
│ │ ├── factory/
│ │ │ ├── Emp1Factory.java
│ │ │ ├── Emp2Factory.java
│ │ │ └── UserDaoFactory.java
│ │ ├── service/
│ │ │ ├── UserService.java
│ │ │ └── impl/
│ │ │ └── UserServiceImpl.java
│ │ └── test/
│ │ └── UserTest.java
│ └── resources/
│ ├── UserDao.properties
│ ├── applicationContext-實(shí)例工廠創(chuàng)建Bean.xml
│ ├── applicationContext-普通構(gòu)建方法創(chuàng)建Bean.xml
│ ├── applicationContext-靜態(tài)工廠創(chuàng)建Bean.xml
│ ├── applicationContext.xml
│ └── logback.xml
└── test/
└── java/
└── com/
└── demo/
├── LoggerTest.java
├── TestDemo.java
└── UserTest.java
該項(xiàng)目是一個(gè)Spring框架練習(xí)項(xiàng)目,主要圍繞以下核心目標(biāo)進(jìn)行實(shí)踐:
一、核心技術(shù)練習(xí)
Spring IoC容器與Bean管理
- 實(shí)現(xiàn)了多種Bean創(chuàng)建方式(普通構(gòu)造方法、靜態(tài)工廠、實(shí)例工廠)
- 對(duì)應(yīng)配置文件:
applicationContext-*.xml系列文件
設(shè)計(jì)模式應(yīng)用
- 工廠模式:通過
Emp1Factory、Emp2Factory等類實(shí)現(xiàn)對(duì)象創(chuàng)建封裝 - 接口編程:
UserDao接口+Mysql/Oracle多實(shí)現(xiàn)類
- 工廠模式:通過
分層架構(gòu)實(shí)踐
com.demo ├── bean // 數(shù)據(jù)模型層(User.java等實(shí)體類) ├── dao // 數(shù)據(jù)訪問層(數(shù)據(jù)庫操作接口及實(shí)現(xiàn)) ├── service // 業(yè)務(wù)邏輯層(服務(wù)接口及實(shí)現(xiàn)) └── factory // 對(duì)象工廠層(創(chuàng)建Bean的工廠類)
二、功能模塊說明
- 數(shù)據(jù)訪問:通過
UserDao及實(shí)現(xiàn)類操作數(shù)據(jù)庫,支持多數(shù)據(jù)庫類型(MySQL/Oracle) - 依賴注入:使用Spring容器管理對(duì)象依賴關(guān)系
- 日志系統(tǒng):集成logback日志框架(
logback.xml配置) - 配置管理:通過
UserDao.properties實(shí)現(xiàn)配置外部化
三、測試覆蓋
- 單元測試:
LoggerTest(日志測試)、UserTest(用戶功能測試)等測試類 - 測試規(guī)范:遵循與主代碼相同的包結(jié)構(gòu),確保測試代碼可維護(hù)性
四、項(xiàng)目特點(diǎn)
- 性質(zhì):通過多種配置文件和工廠類展示不同實(shí)現(xiàn)方式
- 結(jié)構(gòu)清晰:嚴(yán)格遵循Maven項(xiàng)目規(guī)范和分層架構(gòu)設(shè)計(jì)
- 可擴(kuò)展性:通過接口和工廠模式預(yù)留功能擴(kuò)展點(diǎn)
該項(xiàng)目適合初學(xué)者理解Spring核心概念、設(shè)計(jì)模式應(yīng)用及企業(yè)級(jí)項(xiàng)目分層架構(gòu)思想。
實(shí)體類 bean
package com.demo.bean;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
public class Demo {
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties properties;
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Set<String> getSet() {
return set;
}
public void setSet(Set<String> set) {
this.set = set;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public Properties getProperties() {
return properties;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
package com.demo.bean;
public class Emp1 {
public void update1(){
System.out.println("Emp1的update1()方法被調(diào)用。。。 。。。");
}
}
package com.demo.bean;
public class Emp2 {
public void update2(){
System.out.println("Emp2的update2()方法被調(diào)用。。。 。。。");
}
}
package com.demo.bean;
public class User {
private Integer userId;
private String username;
private String password;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}dao層
import com.demo.bean.User;
public interface UserDao {
public boolean updateUser(User user);
}
import com.demo.bean.User;
import com.demo.dao.UserDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MysqlUserDaoImpl implements UserDao {
@Override
public boolean updateUser(User user) {
Logger logger = LoggerFactory.getLogger(MysqlUserDaoImpl.class);
logger.info("Mysql正在進(jìn)行修改操作:updateUser();");
return true;
}
}
import com.demo.bean.User;
import com.demo.dao.UserDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class OracleUserDaoImpl implements UserDao {
@Override
public boolean updateUser(User user) {
Logger logger = LoggerFactory.getLogger(OracleUserDaoImpl.class);
logger.info("Oracle正在進(jìn)行修改操作:updateUser();");
return true;
}
}簡單工廠模式
import com.demo.bean.Emp1;
public class Emp1Factory {
public static Emp1 getInstance(){
return new Emp1();
}
}
package com.demo.factory;
import com.demo.bean.Emp2;
public class Emp2Factory {
public Emp2 getInstance() {
return new Emp2();
}
}
package com.demo.factory;
import com.demo.dao.UserDao;
import java.io.InputStream;
import java.util.Properties;
public class UserDaoFactory {
public UserDao getInstance() {
UserDao userDao = null;
try {
//讀取屬性文件
Properties properties = new Properties();
InputStream in = UserDaoFactory.class.getClassLoader().getResourceAsStream("UserDao.properties");
properties.load(in);
//通過key獲取全名字符串
String userDaoFullName = properties.getProperty("userDao");
//通過反射獲取類的實(shí)例對(duì)象
userDao = (UserDao) Class.forName(userDaoFullName).newInstance();
} catch (
Exception e) {
e.printStackTrace();
}
return userDao;
}
}service層
import com.demo.bean.User;
public interface UserService {
public boolean updateUser(User user);
}
package com.demo.service.impl;
import com.demo.bean.User;
import com.demo.dao.UserDao;
import com.demo.factory.UserDaoFactory;
import com.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 1.UserDao 的實(shí)現(xiàn)類不由UserServiceImpl來決定,而是由UserDaoFactory來決定<第一種>
* 2.控制權(quán)從UserServiceImpl轉(zhuǎn)移到了UserDaoFactory,這就是控制反轉(zhuǎn)IOC/DI
*/
@Service
public class UserServiceImpl implements UserService{
/**
<第一種>
UserDaoFactory userDaoFactory=new UserDaoFactory();
UserDao userDao=userDaoFactory.getInstance();*/
@Autowired
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
// private UserDao userDao=new UserDaoFactory.getInstance();//報(bào)錯(cuò)
// private UserDao userDao=new MysqlUserDaoImpl();
//private UserDao userDao=new OracleUserDaoImpl();
@Override
public boolean updateUser(User user) {
return userDao.updateUser(user);
}
}測試
日志測試
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggerTest {
@Test
public void loggerTest() {
//System.out.println(LoggerFactory.getLogger("hello"));
Logger logger = LoggerFactory.getLogger(LoggerTest.class);
//slf4j日志的級(jí)別
logger.trace("trace");
logger.debug("debug");
logger.info("info");
logger.warn("warn");
logger.error("error");
//拼接
logger.info("Welcome to {} {} ", "www.51zxw.net", "go!");
}
}測試 applicationContext.xml 配置文件的配置
package com.demo;
import com.demo.bean.Demo;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.*;
public class TestDemo {
Logger logger = LoggerFactory.getLogger(LoggerTest.class);
@Test
public void testDemo() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Demo demo = (Demo) context.getBean("demo");
List<String> list = demo.getList();
logger.info("list----------------------");
for (String s : list) {
logger.info(s);
}
logger.info("set----------------------");
Set<String> set = demo.getSet();
for (String s : set) {
logger.info(s);
}
logger.info("map----------------------");
Map<String, String> map = demo.getMap();
Set<String> keySet = map.keySet();
Iterator<String> iterator = keySet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
String value = map.get(key);
logger.info(key + " " + value);
}
logger.info("properties----------------------");
Properties properties = demo.getProperties();
String userId = properties.getProperty("userId");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
logger.info(userId);
logger.info(username);
logger.info(password);
}
}測試其他集中配置文件管理Bean
package com.demo;
import com.demo.bean.Emp1;
import com.demo.bean.Emp2;
import com.demo.bean.User;
import com.demo.dao.UserDao;
import com.demo.service.UserService;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 1.從SpringIOC容器工廠中獲取一個(gè)User對(duì)象
* a。獲取工廠BeanFactory
* b。getBean()返回對(duì)象
* 2.ApplicationContext是BeanFactory的子接口(實(shí)際上也是工廠)
*/
public class UserTest {
Logger logger = LoggerFactory.getLogger(LoggerTest.class);
/**
* 測試普通構(gòu)造方法創(chuàng)建的Bean
*/
@Test
public void userTest() {
//獲取BeanFactory的子接口,它是用來獲得配置在SpringIOC容器的對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//從SpringIOC容器工廠中獲取一個(gè)User對(duì)象
User user = (User) context.getBean("user");
if (null != user) {
logger.info(user.toString());
}
}
/**
* 測試普通構(gòu)造方法創(chuàng)建的Bean
*/
@Test
public void userDaoTest() {
//獲取BeanFactory的子接口,它是用來獲得配置在SpringIOC容器的對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-實(shí)例工廠創(chuàng)建Bean.xml");
//從SpringIOC容器工廠中獲取一個(gè)User對(duì)象
UserDao userDao = (UserDao) context.getBean("userDao");
if (null != userDao) {
userDao.updateUser(null);
}
}
/**
* 靜態(tài)工廠創(chuàng)建Bean
*/
@Test
public void emp1Test() {
//獲取BeanFactory的子接口,它是用來獲得配置在SpringIOC容器的對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-實(shí)例工廠創(chuàng)建Bean.xml");
//從SpringIOC容器工廠中獲取一個(gè)User對(duì)象
Emp1 emp1 = (Emp1) context.getBean("emp1");
if (null != emp1) {
emp1.update1();
}
}
/**
* 實(shí)例工廠創(chuàng)建Bean
*/
@Test
public void emp2Test() {
//獲取BeanFactory的子接口,它是用來獲得配置在SpringIOC容器的對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-實(shí)例工廠創(chuàng)建Bean.xml");
//從SpringIOC容器工廠中獲取一個(gè)User對(duì)象
Emp2 emp2 = (Emp2) context.getBean("emp2");
if (null != emp2) {
emp2.update2();
}
}
@Test
public void userServiceTest() {
//獲取BeanFactory的子接口,它是用來獲得配置在SpringIOC容器的對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//從SpringIOC容器工廠中獲取一個(gè)User對(duì)象
UserService userService = (UserService) context.getBean("userService");
if (null != userService) {
userService.updateUser(null);
}
}
}測試第一種被UserDaoFactory來決定實(shí)現(xiàn)的方式
要解開注解,UserServiceImpl代碼改為
UserDaoFactory userDaoFactory=new UserDaoFactory();
UserDao userDao=userDaoFactory.getInstance();
// @Autowired
// private UserDao userDao;
// 其余不變
package com.demo.test;
import com.demo.bean.User;
import com.demo.service.UserService;
import com.demo.service.impl.UserServiceImpl;
public class UserTest {
public static void main(String[] args) {
UserService userService=new UserServiceImpl();
User user=new User();
userService.updateUser(user);
}
}配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 創(chuàng)建對(duì)象-->
<bean id="user" class="com.demo.bean.User">
<!-- 為對(duì)象注入屬性值 -->
<property name="userId" value="1"></property>
<property name="username" value="張三"></property>
<property name="password" value="123456"></property>
</bean>
<!-- 1.創(chuàng)建屬性對(duì)象MysqlUserDaoImpl(如果是Besn類型)
a.必須添加setter()方法注入屬性;
b.通過構(gòu)造方法注入屬性
2.創(chuàng)建userService
-->
<bean id="userDao" class="com.demo.dao.impl.MysqlUserDaoImpl"></bean>
<bean id="userService" class="com.demo.service.impl.UserServiceImpl">
<!-- ref是通過引用userDao,然后找到實(shí)現(xiàn)類 -->
<property name="userDao" ref="userDao"></property>
</bean>
<!--
集合屬性的注入:
list:添加list節(jié)點(diǎn),然后如果集合中的數(shù)據(jù)是引用數(shù)據(jù)類型需要使用ref節(jié)點(diǎn),如果是基本數(shù)據(jù)類型用value
set:添加set節(jié)點(diǎn),然后如果集合中的數(shù)據(jù)是引用數(shù)據(jù)類型需要使用ref節(jié)點(diǎn),如果是基本數(shù)據(jù)類型用value
map:添加map節(jié)點(diǎn),由于map中儲(chǔ)存的是key和value鍵值對(duì),需要添加一個(gè)entry節(jié)點(diǎn)
對(duì)應(yīng)key,如果數(shù)據(jù)是引用數(shù)據(jù)類型需要使用ref節(jié)點(diǎn),如果是基本數(shù)據(jù)類型用value
對(duì)應(yīng)value,如果數(shù)據(jù)是引用數(shù)據(jù)類型需要使用ref節(jié)點(diǎn),如果是基本數(shù)據(jù)類型用value
properties:添加props節(jié)點(diǎn),然后在添加prop
-->
<bean id="demo" class="com.demo.bean.Demo">
<property name="list">
<list>
<value>喬丹</value>
<value>科比</value>
<!--<bean>ref的配置</bean>-->
<!-- <ref>如果是類類型,或者引用數(shù)據(jù)類型,需要ref</ref>-->
</list>
</property>
<property name="set">
<set>
<value>姚明</value>
<value>易建聯(lián)</value>
<value>王致和</value>
</set>
</property>
<property name="map">
<map>
<entry>
<key>
<value>001</value>
</key>
<value>籃球</value>
</entry>
<entry>
<key>
<value>002</value>
</key>
<value>足球</value>
</entry>
<entry>
<key>
<value>003</value>
</key>
<value>乒乓球</value>
</entry>
</map>
</property>
<property name="properties">
<props>
<prop key="userId">1</prop>
<prop key="username">test</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
</beans>
applicationContext-實(shí)例工廠創(chuàng)建Bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--采用實(shí)例工廠創(chuàng)建Bean
1.創(chuàng)建Emp2
2.創(chuàng)建Emp2Factory靜態(tài)工廠
3.編寫配置文件,注意和普通工廠對(duì)比,多兩個(gè)屬性配置factory-method="靜態(tài)方法名"
factory-bean屬性的配置
總結(jié):相比普通構(gòu)造方法創(chuàng)建Bean而言稍微麻煩一些,所以很少用
-->
<bean id="emp2Factory" class="com.demo.factory.Emp2Factory"></bean>
<bean id="emp2" factory-bean="emp2Factory" factory-method="getInstance"></bean>
</beans>
applicationContext-普通構(gòu)建方法創(chuàng)建Bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Spring容器-->
<!--采用普通的構(gòu)造方法來創(chuàng)建Bean-->
<bean id="userService" class="com.demo.service.impl.UserServiceImpl"></bean>
<bean id="userDao" class="com.demo.dao.impl.MysqlUserDaoImpl"></bean>
<!-- 采用普通的構(gòu)建方法創(chuàng)建User-->
<bean id="user" class="com.demo.bean.User"></bean>
</beans>
applicationContext-靜態(tài)工廠創(chuàng)建Bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--采用靜態(tài)工廠創(chuàng)建Bean
1.創(chuàng)建Emp1
2.創(chuàng)建Emp1Factory靜態(tài)工廠
3.編寫配置文件,注意和普通工廠對(duì)比,多一個(gè)屬性配置factory-method="靜態(tài)方法名"
總結(jié):相比普通構(gòu)造方法創(chuàng)建Bean而言稍微麻煩一些,所以很少用
-->
<bean id="emp1" class="com.demo.factory.Emp1Factory" factory-method="getInstance"></bean>
</beans>
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--輸出日志到控制臺(tái) appender追加-->
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<!--負(fù)責(zé)把事件轉(zhuǎn)成字符串,格式化日志信息的輸出-->
<layout>
<pattern>
<!--%p是日志優(yōu)先級(jí)%d是日期,%msg是日志消息%n換行-->
[%p]%d-%msg%n
</pattern>
</layout>
</appender>
<appender name="fileLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>DENY</onMatch>
</filter>
<encoder>
<pattern>
[%p]%d-%msg%n
</pattern>
</encoder>
<!-- 指定文件的輸出位置-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>
</fileNamePattern>
</rollingPolicy>
</appender>
<!-- 控制臺(tái)可以輸出的級(jí)別 -->
<root level="info">
<appender-ref ref="consoleLog"></appender-ref>
<appender-ref ref="fileLog"></appender-ref>
</root>
</configuration>
UserDao.properties
userDao=com.demo.dao.impl.OracleUserDaoImpl
總結(jié)
到此這篇關(guān)于Spring IoC容器與Bean管理的文章就介紹到這了,更多相關(guān)Spring IoC容器與Bean管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot實(shí)現(xiàn)緩存預(yù)熱的方法
在系統(tǒng)啟動(dòng)之前通過預(yù)先將常用數(shù)據(jù)加載到緩存中,以提高緩存命中率和系統(tǒng)性能的過程,緩存預(yù)熱的目的是盡可能地避免緩存擊穿和緩存雪崩,這篇文章主要介紹了Springboot實(shí)現(xiàn)緩存預(yù)熱,需要的朋友可以參考下2024-03-03
Java線程池如何實(shí)現(xiàn)精準(zhǔn)控制每秒API請(qǐng)求
這篇文章主要介紹了Java線程池如何實(shí)現(xiàn)精準(zhǔn)控制每秒API請(qǐng)求問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
Mybatis之解決collection一對(duì)多問題(顯示的結(jié)果沒有整合到一起)
這篇文章主要介紹了Mybatis之解決collection一對(duì)多問題(顯示的結(jié)果沒有整合到一起),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
Java中動(dòng)態(tài)規(guī)則的實(shí)現(xiàn)方式示例詳解
這篇文章主要介紹了Java中動(dòng)態(tài)規(guī)則的實(shí)現(xiàn)方式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
springboot接口接收數(shù)組及多個(gè)參數(shù)的問題及解決
這篇文章主要介紹了springboot接口接收數(shù)組及多個(gè)參數(shù)的問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
使用MyBatis攔截器實(shí)現(xiàn)sql查詢權(quán)限動(dòng)態(tài)修改代碼實(shí)例
這篇文章主要介紹了使用MyBatis攔截器實(shí)現(xiàn)sql查詢權(quán)限動(dòng)態(tài)修改代碼實(shí)例,為了不耦合,現(xiàn)在的方案是在需要鑒權(quán)的Mybatis?Mapper方法上增加一個(gè)注解,在運(yùn)行過程中判斷該注解存在即對(duì)sql進(jìn)行修改,需要的朋友可以參考下2023-08-08
如何通過ServletInputStream讀取http請(qǐng)求傳入的數(shù)據(jù)
這篇文章主要介紹了如何通過ServletInputStream讀取http請(qǐng)求傳入的數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
使用Java8進(jìn)行分組(多個(gè)字段的組合分組)
本文主要介紹了使用Java8進(jìn)行分組(多個(gè)字段的組合分組),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07

