柚子快報(bào)激活碼778899分享:java Maven高級(jí)
柚子快報(bào)激活碼778899分享:java Maven高級(jí)
?喜歡的朋友可以關(guān)注一下,下次更新不迷路!?(●'?'●)
一、分模塊開(kāi)發(fā)?
1、為什么分模塊開(kāi)發(fā)
先由一個(gè)銀行的例子引入?
網(wǎng)絡(luò)沒(méi)有那么發(fā)達(dá)的時(shí)候,我們需要到銀行柜臺(tái)或者取款機(jī)進(jìn)行業(yè)務(wù)操作隨著互聯(lián)網(wǎng)的發(fā)展,我們有了電腦以后,就可以在網(wǎng)頁(yè)上登錄銀行網(wǎng)站使用U盾進(jìn)行業(yè)務(wù)操作再來(lái)就是隨著智能手機(jī)的普及,我們只需要用手機(jī)登錄APP就可以進(jìn)行業(yè)務(wù)操作
?這樣會(huì)出現(xiàn)三個(gè)用戶端:1、銀行柜臺(tái)+取款機(jī)。2、網(wǎng)頁(yè)銀行網(wǎng)站。3、手機(jī)APP。?
上面三個(gè)場(chǎng)景出現(xiàn)的時(shí)間是不相同的,如果非要把三個(gè)場(chǎng)景的模塊代碼放入到一個(gè)項(xiàng)目,那么當(dāng)其中某一個(gè)模塊代碼出現(xiàn)問(wèn)題,就會(huì)導(dǎo)致整個(gè)項(xiàng)目無(wú)法正常啟動(dòng)?,從而導(dǎo)致銀行的多個(gè)業(yè)務(wù)都無(wú)法正常班理。所以我們需要按照功能將項(xiàng)目拆分進(jìn)行分模塊開(kāi)發(fā)。
2、開(kāi)發(fā)實(shí)現(xiàn)
前面我們已經(jīng)完成了SSM整合,接下來(lái),咱們就基于SSM整合的項(xiàng)目來(lái)實(shí)現(xiàn)對(duì)項(xiàng)目的拆分。?
OK!讓我們啟動(dòng)!?
環(huán)境配置?
先來(lái)一個(gè)最裹腳布的操作-----環(huán)境配置路?♂?
JdbcConfig:
????????定義了與數(shù)據(jù)庫(kù)連接相關(guān)的Bean。具體來(lái)說(shuō),它定義了一個(gè)DataSource?Bean和一個(gè)PlatformTransactionManager?Bean。?
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
@Bean
public DataSource dataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager ds = new DataSourceTransactionManager();
ds.setDataSource(dataSource);
return ds;
}
}
?MyBatisConfig:
?SqlSessionFactoryBean它的主要作用是創(chuàng)建和配置?SqlSessionFactory
SqlSessionFactory?用于創(chuàng)建?SqlSession?實(shí)例,
SqlSession?是執(zhí)行 SQL 操作的接口。
?MapperScannerConfigurer的主要作用是掃描指定包中的接口,并將這些接口注冊(cè)為 Spring 容器中的 Mapper 接口的代理實(shí)現(xiàn)類(lèi)。這樣,你就可以直接在 Spring 應(yīng)用程序中使用這些 Mapper 接口,而無(wú)需手動(dòng)創(chuàng)建它們的實(shí)現(xiàn)類(lèi)。
public class MyBatisConfig {
@Bean
public SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setTypeAliasesPackage("com.itheima.domain");
return factoryBean;
}
@Bean
public MapperScannerConfigurer mapperScannerConfigurer(){
MapperScannerConfigurer msc = new MapperScannerConfigurer();
msc.setBasePackage("com.itheima.dao");
return msc;
}
}
ServletConfig:?
????????作用是使用 Java 類(lèi)而不是 web.xml 來(lái)配置 Spring MVC 應(yīng)用程序。它定義了應(yīng)用程序的配置類(lèi)和?DispatcherServlet?的映射,這樣當(dāng)應(yīng)用程序啟動(dòng)時(shí),Spring 會(huì)自動(dòng)創(chuàng)建和配置所需的上下文和 Servlet。
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
protected Class>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
SpringConfig:
? ? ? ? Spring,我的超人!?
@Configuration:表示這個(gè)類(lèi)是一個(gè)配置類(lèi) @ComponentScan({"com.itheima.service"}):告訴 Spring 掃描指定的包(及其子包)以查找和注冊(cè) Spring 組件(如?@Component、@Service、@Repository、@Controller?等)。在這個(gè)例子中,它會(huì)掃描?com.itheima.service?包下的所有組件。 @PropertySource("classpath:jdbc.properties"):指定一個(gè)屬性資源文件的位置,Spring 會(huì)從這個(gè)文件中加載屬性,并可以在 Spring 應(yīng)用程序中使用這些屬性。在這個(gè)例子中,它指定了類(lèi)路徑下的?jdbc.properties?文件。 @Import({JdbcConfig.class, MyBatisConfig.class}):這個(gè)注解用于導(dǎo)入其他配置類(lèi)。 @EnableTransactionManagement:這個(gè)注解啟用了 Spring 的事務(wù)管理功能,允許在 Spring 應(yīng)用程序中使用聲明式事務(wù)。這意味著你可以使用?@Transactional?注解來(lái)標(biāo)記需要事務(wù)管理的方法。
@Configuration
@ComponentScan({"com.itheima.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MyBatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}
?SpringMvcConfig:
????????@EnableWebMvc:?jiǎn)⒂昧?Spring MVC 的多項(xiàng)關(guān)鍵功能,包括配置 DispatcherServlet、視圖解析、靜態(tài)資源處理等。這個(gè)注解相當(dāng)于在 XML 配置中聲明?
@Configuration
@ComponentScan({"com.itheima.controller","com.itheima.config"})
@EnableWebMvc
public class SpringMvcConfig {
}
?SpringMvcSupport:
????????擴(kuò)展了?WebMvcConfigurationSupport?的配置類(lèi),用于自定義 Spring MVC 的行為。這個(gè)類(lèi)主要用于配置靜態(tài)資源的處理,例如 CSS、JavaScript、圖片等。
????????通過(guò)重寫(xiě)?addResourceHandlers?方法,可以添加資源處理器,以便將特定的 URL 映射到相應(yīng)的資源位置。
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
registry.addResourceHandler("/css/**").addResourceLocations("/css/");
registry.addResourceHandler("/js/**").addResourceLocations("/js/");
registry.addResourceHandler("/plugins/**").addResourceLocations("/plugins/");
}
}
表現(xiàn)層?
????????負(fù)責(zé)處理用戶的請(qǐng)求并將結(jié)果返回給用戶。?
?
BookController?
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@PostMapping
public Result save(@RequestBody Book book) {
boolean flag = bookService.save(book);
return new Result(flag ? Code.SAVE_OK:Code.SAVE_ERR,flag);
}
@PutMapping
public Result update(@RequestBody Book book) {
boolean flag = bookService.update(book);
return new Result(flag ? Code.UPDATE_OK:Code.UPDATE_ERR,flag);
}
@DeleteMapping("/{id}")
public Result delete(@PathVariable Integer id) {
boolean flag = bookService.delete(id);
return new Result(flag ? Code.DELETE_OK:Code.DELETE_ERR,flag);
}
@GetMapping("/{id}")
public Result getById(@PathVariable Integer id) {
Book book = bookService.getById(id);
Integer code = book != null ? Code.GET_OK : Code.GET_ERR;
String msg = book != null ? "" : "數(shù)據(jù)查詢失敗,請(qǐng)重試!";
return new Result(code,book,msg);
}
@GetMapping
public Result getAll() {
List
Integer code = bookList != null ? Code.GET_OK : Code.GET_ERR;
String msg = bookList != null ? "" : "數(shù)據(jù)查詢失敗,請(qǐng)重試!";
return new Result(code,bookList,msg);
}
}
Code
? ? ? ? 返回?cái)?shù)據(jù)狀態(tài)碼常量
? ? ? ? 異常處理標(biāo)號(hào)常量
地球毀滅,異常拋給太陽(yáng),聽(tīng)懂掌聲! 藍(lán)
public class Code {
public static final Integer SAVE_OK = 20011;
public static final Integer DELETE_OK = 20021;
public static final Integer UPDATE_OK = 20031;
public static final Integer GET_OK = 20041;
public static final Integer SAVE_ERR = 20010;
public static final Integer DELETE_ERR = 20020;
public static final Integer UPDATE_ERR = 20030;
public static final Integer GET_ERR = 20040;
public static final Integer SYSTEM_ERR = 50001;
public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
public static final Integer SYSTEM_UNKNOW_ERR = 59999;
public static final Integer BUSINESS_ERR = 60002;
}
?Result
? ? ? ? 返回?cái)?shù)據(jù)的封裝
public class Result {
private Object data;
private Integer code;
private String msg;
public Result() {
}
public Result(Integer code,Object data) {
this.data = data;
this.code = code;
}
public Result(Integer code, Object data, String msg) {
this.data = data;
this.code = code;
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
?異常處理
業(yè)務(wù)異常?
public class BusinessException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public BusinessException(Integer code, String message) {
super(message);
this.code = code;
}
public BusinessException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
}
}
?系統(tǒng)異常
public class SystemException extends RuntimeException{
private Integer code;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public SystemException(Integer code, String message) {
super(message);
this.code = code;
}
public SystemException(Integer code, String message, Throwable cause) {
super(message, cause);
this.code = code;
}
}
?服務(wù)層(業(yè)務(wù)邏輯層)
?BookServiceImpl
@Service
public class BookServiceImpl implements BookService {
@Autowired
private BookDao bookDao;
public boolean save(Book book) {
return bookDao.save(book) > 0;
}
public boolean update(Book book) {
return bookDao.update(book) > 0;
}
public boolean delete(Integer id) {
return bookDao.delete(id) > 0;
}
public Book getById(Integer id) {
if(id == 1){
throw new BusinessException(Code.BUSINESS_ERR,"請(qǐng)不要使用你的技術(shù)挑戰(zhàn)我的耐性!");
}
//
return bookDao.getById(id);
}
public List
return bookDao.getAll();
}
}
?BookService
@Transactional
public interface BookService {
/**
* 保存
* @param book
* @return
*/
public boolean save(Book book);
/**
* 修改
* @param book
* @return
*/
public boolean update(Book book);
/**
* 按id刪除
* @param id
* @return
*/
public boolean delete(Integer id);
/**
* 按id查詢
* @param id
* @return
*/
public Book getById(Integer id);
/**
* 查詢?nèi)?/p>
* @return
*/
public List
}
創(chuàng)建新的模塊
實(shí)體類(lèi)Book
在maven_03_pojo項(xiàng)目中創(chuàng)建com.itheima.domain包,并將maven_02_ssm中Book類(lèi)拷貝到該包中,并將maven_02_ssm中Book類(lèi)刪除。
因?yàn)閯h除掉實(shí)體類(lèi)后所以要在maven_02_ssm中的pop.xml添加maven_03_pojo的依賴。
?Dao層(BookDao)
?在maven_04_dao項(xiàng)目的pom.xml中添加maven_03_pojo項(xiàng)目,這使得
maven_04_dao的BookDao接口中能找到Book類(lèi)
?在maven_04_dao項(xiàng)目的pom.xml中添加mybatis的相關(guān)依賴,這使得
maven_04_dao的BookDao接口中,Mybatis的增刪改查注解不會(huì)報(bào)錯(cuò)
刪除原項(xiàng)目中的Dao包(爽!?)
刪除Dao包以后,因?yàn)閙aven_02_ssm中的BookServiceImpl類(lèi)中有使用到Dao的內(nèi)容,所以需要在maven_02_ssm的pom.xml添加maven_04_dao的依賴?
?此時(shí)在maven_02_ssm項(xiàng)目中就已經(jīng)添加了maven_03_pojo和maven_04_dao包
運(yùn)行測(cè)試
將需要被依賴的項(xiàng)目maven_04_dao,使用maven的install命令,把其安裝到Maven的本地倉(cāng)庫(kù)中。?
再次對(duì)項(xiàng)目進(jìn)行編譯?
?
?二、繼承與聚合
聚合
定義:將多個(gè)模塊組織成一個(gè)整體,同時(shí)進(jìn)行項(xiàng)目構(gòu)建的過(guò)程稱(chēng)為聚合
作用:使用聚合工程可以將多個(gè)工程編組,實(shí)現(xiàn)對(duì)所包含的模塊進(jìn)行同步構(gòu)建
當(dāng)工程中某個(gè)模塊發(fā)生更新(變更)時(shí),必須保障工程中與已更新模塊關(guān)聯(lián)的模塊同步更新,此時(shí)可以使用聚合工程來(lái)解決批量模塊同步構(gòu)建的問(wèn)題。
步驟一:創(chuàng)建一個(gè)空的maven項(xiàng)目
步驟2:將項(xiàng)目的打包方式改為pom?
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
?三種打包方式:
jar:默認(rèn)情況,說(shuō)明該項(xiàng)目為java項(xiàng)目war:說(shuō)明該項(xiàng)目為web項(xiàng)目pom:說(shuō)明該項(xiàng)目為聚合或繼承(后面會(huì)講)項(xiàng)目
步驟3:pom.xml添加所要管理的項(xiàng)目?
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
?步驟4:使用聚合統(tǒng)一管理項(xiàng)目
?
當(dāng)maven_01_parent的compile被點(diǎn)擊后,所有被其管理的項(xiàng)目都會(huì)被執(zhí)行編譯操作。這就是聚合工程的作用。
最后總結(jié)一句話就是,聚合工程主要是用來(lái)管理項(xiàng)目。?
?繼承
多模塊開(kāi)發(fā)存在的另外一個(gè)問(wèn)題,重復(fù)配置的問(wèn)題。?
所謂繼承:描述的是兩個(gè)工程間的關(guān)系,與java中的繼承相似,子工程可以繼承父工程中的配置信息,常見(jiàn)于依賴關(guān)系的繼承。作用:
簡(jiǎn)化配置減少版本沖突
?步驟1:創(chuàng)建一個(gè)空的Maven項(xiàng)目并將其打包方式設(shè)置為pom
?步驟2:在子項(xiàng)目中設(shè)置其父工程
分別在maven_02_ssm,maven_03_pojo,maven_04_dao的pom.xml中添加其父項(xiàng)目為maven_01_parent?
?步驟3:優(yōu)化子項(xiàng)目共有依賴導(dǎo)入問(wèn)題
1、將子項(xiàng)目共同使用的jar包都抽取出來(lái),維護(hù)在父項(xiàng)目的pom.xml中
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
2、刪除子項(xiàng)目中已經(jīng)被抽取到父項(xiàng)目的pom.xml中的jar包,如在maven_02_ssm的pom.xml中將已經(jīng)出現(xiàn)在父項(xiàng)目的jar包刪除掉?
?三、屬性
作用:可以同時(shí)修改依賴的版本?
?
?
?
版本管理
Maven中的依賴有很多版本?
?四、私服
私服簡(jiǎn)介
(1)張三負(fù)責(zé)ssm_crm的開(kāi)發(fā),自己寫(xiě)了一個(gè)ssm_pojo模塊,要想使用直接將ssm_pojo安裝到本地倉(cāng)庫(kù)即可
(2)李四負(fù)責(zé)ssm_order的開(kāi)發(fā),需要用到張三所寫(xiě)的ssm_pojo模塊,這個(gè)時(shí)候如何將張三寫(xiě)的ssm_pojo模塊交給李四呢?
(3)如果直接拷貝,那么團(tuán)隊(duì)之間的jar包管理會(huì)非?;靵y而且容器出錯(cuò),這個(gè)時(shí)候我們就想能不能將寫(xiě)好的項(xiàng)目上傳到中央倉(cāng)庫(kù),誰(shuí)想用就直接聯(lián)網(wǎng)下載即可
(4)Maven的中央倉(cāng)庫(kù)不允許私人上傳自己的jar包,那么我們就得換種思路,自己搭建一個(gè)類(lèi)似于中央倉(cāng)庫(kù)的東西,把自己的內(nèi)容上傳上去,其他人就可以從上面下載jar包使用
(5)這個(gè)類(lèi)似于中央倉(cāng)庫(kù)的東西就是我們接下來(lái)要學(xué)習(xí)的私服
所以到這就有兩個(gè)概念,一個(gè)是私服,一個(gè)是中央倉(cāng)庫(kù)
私服:公司內(nèi)部搭建的用于存儲(chǔ)Maven資源的服務(wù)器
中央倉(cāng)庫(kù):Maven開(kāi)發(fā)團(tuán)隊(duì)維護(hù)的用于存儲(chǔ)Maven資源的服務(wù)器
?私服倉(cāng)庫(kù)分類(lèi)
(1)在沒(méi)有私服的情況下,我們自己創(chuàng)建的服務(wù)都是安裝在Maven的本地倉(cāng)庫(kù)中
(2)私服中也有倉(cāng)庫(kù),我們要把自己的資源上傳到私服,最終也是放在私服的倉(cāng)庫(kù)中
(3)其他人要想使用你所上傳的資源,就需要從私服的倉(cāng)庫(kù)中獲取
(4)當(dāng)我們要使用的資源不是自己寫(xiě)的,是遠(yuǎn)程中央倉(cāng)庫(kù)有的第三方j(luò)ar包,這個(gè)時(shí)候就需要從遠(yuǎn)程中央倉(cāng)庫(kù)下載,每個(gè)開(kāi)發(fā)者都去遠(yuǎn)程中央倉(cāng)庫(kù)下速度比較慢(中央倉(cāng)庫(kù)服務(wù)器在國(guó)外)
(5)私服就再準(zhǔn)備一個(gè)倉(cāng)庫(kù),用來(lái)專(zhuān)門(mén)存儲(chǔ)從遠(yuǎn)程中央倉(cāng)庫(kù)下載的第三方j(luò)ar包,第一次訪問(wèn)沒(méi)有就會(huì)去遠(yuǎn)程中央倉(cāng)庫(kù)下載,下次再訪問(wèn)就直接走私服下載
(6)前面在介紹版本管理的時(shí)候提到過(guò)有SNAPSHOT和RELEASE,如果把這兩類(lèi)的都放到同一個(gè)倉(cāng)庫(kù),比較混亂,所以私服就把這兩個(gè)種jar包放入不同的倉(cāng)庫(kù)
(7)上面我們已經(jīng)介紹了有三種倉(cāng)庫(kù),一種是存放SNAPSHOT的,一種是存放RELEASE還有一種是存放從遠(yuǎn)程倉(cāng)庫(kù)下載的第三方j(luò)ar包,那么我們?cè)讷@取資源的時(shí)候要從哪個(gè)倉(cāng)庫(kù)種獲取呢?
(8)為了方便獲取,我們將所有的倉(cāng)庫(kù)編成一個(gè)組,我們只需要訪問(wèn)倉(cāng)庫(kù)組去獲取資源。
所有私服倉(cāng)庫(kù)總共分為三大類(lèi):
宿主倉(cāng)庫(kù)hosted
保存無(wú)法從中央倉(cāng)庫(kù)獲取的資源 自主研發(fā) 第三方非開(kāi)源項(xiàng)目,比如Oracle,因?yàn)槭歉顿M(fèi)產(chǎn)品,所以中央倉(cāng)庫(kù)沒(méi)有
代理倉(cāng)庫(kù)proxy
代理遠(yuǎn)程倉(cāng)庫(kù),通過(guò)nexus訪問(wèn)其他公共倉(cāng)庫(kù),例如中央倉(cāng)庫(kù)
倉(cāng)庫(kù)組group
將若干個(gè)倉(cāng)庫(kù)組成一個(gè)群組,簡(jiǎn)化配置 倉(cāng)庫(kù)組不能保存資源,屬于設(shè)計(jì)型倉(cāng)庫(kù)
本地倉(cāng)庫(kù)訪問(wèn)私服配置
我們通過(guò)IDEA將開(kāi)發(fā)的模塊上傳到私服,中間是要經(jīng)過(guò)本地Maven的本地Maven需要知道私服的訪問(wèn)地址以及私服訪問(wèn)的用戶名和密碼私服中的倉(cāng)庫(kù)很多,Maven最終要把資源上傳到哪個(gè)倉(cāng)庫(kù)?Maven下載的時(shí)候,又需要攜帶用戶名和密碼到私服上找對(duì)應(yīng)的倉(cāng)庫(kù)組進(jìn)行下載,然后再給IDEA
上面所說(shuō)的這些內(nèi)容,我們需要在本地Maven的配置文件settings.xml中進(jìn)行配置。 ?
步驟一:下載Nexus?
傳送入口?
?
?步驟二:配置私服的名稱(chēng)
在maven的settings.xml文件中
改為?
?步驟三:配置私服的url訪問(wèn)路徑
?在settings.xml中
?
?步驟四:創(chuàng)建倉(cāng)庫(kù)
?資源上傳和下載
?步驟1:配置工程上傳私服的具體位置
在idea的pop.xml中配置
?步驟2:發(fā)布資源到私服
?
?注意:
要發(fā)布的項(xiàng)目都需要配置distributionManagement標(biāo)簽,要么在自己的pom.xml中配置,要么在其父項(xiàng)目中配置,然后子項(xiàng)目中繼承父項(xiàng)目即可。
?
?如果私服中沒(méi)有對(duì)應(yīng)的jar,會(huì)去中央倉(cāng)庫(kù)下載,速度很慢??梢耘渲米屗椒グ⒗镌浦邢螺d依賴。
?
柚子快報(bào)激活碼778899分享:java Maven高級(jí)
推薦鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。