文章目錄
- 前言
- 1. 常見的一些概念
- 1.1 POJO(Plain Ordinary Java Object 簡單Java對象)
- 1.2 DAO和Mapper
- 2. Java的三層架構
- 2.1 包的層級結構
- 2.2 交互層 controller(用戶界面、網頁)jsp文件
- 2.3 業務處理層 service
- 2.4 Mapper層
- 3. 注解
- 3.1 @SpringBootApplication
- 3.2 Bean對象的聲明
- 3.3 @Autowired
- 3.4 @RequestBody
- 3.5 @ResponseBody
- 3.6 @PathVariable
- 3.7 @RequestParam
- 3.8 @RequestMapping、@GetMapping、@@PostMapping等等
- 3.9 @Configuration
- 3.10 @Import
- 3.11 @Bean
- 3.12 @Transactional
- 3.13 切面
- 3.14 @Slf4j
- 3.15 lombok
- 總結
前言
這段時間在繼續沉淀Java后端的東西,看的網課是黑馬的23版JavaWeb開發,整體只是把很多知識點過了一遍,發現好多知識點都不明白,加之前面基礎不牢,整體感受就是面向注解編程,感覺整個人就稀里糊涂。做完了這個Demo后,我也打算來好好整理一下目前的知識點。
最大的一個感覺就是Java的生態圈是真的龐大,這也是為啥這么多年了Java仍然能在國內市場當老大的原因吧。
1. 常見的一些概念
1.1 POJO(Plain Ordinary Java Object 簡單Java對象)
POJO就是一個非常簡單的對象,一般只包含一些基本的參數,一般就用來表示數據結構,例如數據庫中的表結構。
POJO的內在含義是指:那些沒有繼承任何類、也沒有實現任何接口,更沒有被其它框架侵入的java對象。
它僅包含自身的屬性以及自身屬性的getter和setter方法,這意味者POJO可以方便的從一個框架遷移到另一個框架中,或者框架升級也會對代碼毫無影響,因此而得到復用。
Bean
Bean是POJO的特殊類型,所有的Java Bean都是POJO。
-
JavaBean是遵循特定編寫規范的Java類,主要用于封裝數據。具體來說,一個JavaBean需要滿足以下規范:實現Serializable接口以支持序列化;提供一個無參構造函數;使用私有屬性存儲數據,并提供公共的getter和setter方法訪問和修改這些屬性;對于值類型的屬性,使用私有屬性存儲數據;對于引用類型的屬性,使用私有屬性存儲對對象的引用,并提供公共的getter和setter方法訪問和修改這些引用。
-
相比之下,POJO(Plain Ordinary Java Object)是一種更純凈、簡單的Java類或接口。它嚴格地遵守簡單對象的概念,也就是說,POJO主要用于裝載數據,作為數據存儲的載體,而不具有業務邏輯處理的能力。與JavaBean不同,POJO沒有嚴格的編寫規范,只要它包含屬性和相應的getter和setter方法,就可以被視為POJO。
(以上資料來自GPT)
1.2 DAO和Mapper
DAO通常是一個接口,它定義了一些數據訪問方法,而具體的實現則由其他類來完成;而Mapper則是用于將Java對象與SQL語句進行映射的,它通常是一個XML文件,包含了一些SQL語句和一些與Java對象相關的配置信息。
2. Java的三層架構
Java設計三層架構主要目的還是分層解耦。
- 控制反轉:簡稱IOC。對象的創建控制權由程序自身轉移到外部(容器),這種思想被稱為控制反轉。
- 依賴注入:簡稱DI。容器為應用程序提供運行時,所依賴的資源,稱之為依賴注入。
- Bean對象:IOC容器中創建、管理的對象,稱之為Bean。
2.1 包的層級結構
Java開發的包的層級特別多也特別深,在之前我自己做C++開發的時候,都沒有過這種感覺。
這里主要用的是Maven,也是目前最流行的打包方式。
2.2 交互層 controller(用戶界面、網頁)jsp文件
controller層作為與前端交互的層,主要用來接受請求,并且調用業務層service層。
@Slf4j // 自動生成一個名為log的日志對象
@RequestMapping("/depts")
@RestController // 包含ResponseBody注解,將返回對象直接轉為json再響應回來(controller層必要的注解)
public class DeptController {@Autowired // 自動裝配注解,是用來將這個注解下面的對象進行實例化的private DeptService deptService; // 調用業務邏輯層需要聲明相應的業務邏輯層對象/*** 查詢部門數據* @return*/@GetMappingpublic Result list() {log.info("查詢全部部門數據");// 調用service查詢部門數據List<Dept> deptList = deptService.list();return Result.success(deptList);}@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id) { // 前端需要傳遞的參數log.info("根據id刪除部門:{}", id);deptService.delete(id);return Result.success();}
}
2.3 業務處理層 service
主要作用是:與交互層進行數據傳輸,調用數據處理層,完成各種業務功能。
首先要有個業務層接口,然后再有實現類。
public interface DeptService {/*** 查詢全部部門數據* @return*/List<Dept> list();/*** 刪除部門* @param id*/void delete(Integer id);/*** 新增部門* @param dept*/void add(Dept dept);
}
@Service // 這個注解來表明這是個業務邏輯層,到時候自動裝配就可以找到這個層
public class DeptServiceImpl implements DeptService {@Autowiredprivate DeptMapper deptMapper;@Autowiredprivate EmpMapper empMapper;@Overridepublic List<Dept> list() {return deptMapper.list();}@Override@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW) // spring事務管理;默認只有RuntimeException才回滾;這里指定所有異常public void delete(Integer id) {deptMapper.deleteById(id);
// int i = 1 / 0;empMapper.deleteByDeptId(id); // 根據部門id刪除員工}@Overridepublic void add(Dept dept) {dept.setCreateTime(LocalDateTime.now());dept.setUpdateTime(LocalDateTime.now());deptMapper.insert(dept);}
}
2.4 Mapper層
這一層就是進行數據庫的操作了。在這一層,spring有DAO和Mapper兩種實現,一般后者用的多一點。
@Mapper // Mapper層要有的東西
public interface DeptMapper {/*** 查詢全部部門數據* @return*/@Select("select * from dept")List<Dept> list();@Delete("delete from dept where id = #{id}")void deleteById(Integer id);@Insert("insert into dept (name, create_time, update_time) values(#{name}, #{createTime}, #{updateTime})")void insert(Dept dept);
}
關于Mapper層和Service層,前者主要負責和數據庫打交道,而Service層更多則是業務邏輯的處理,包括事務的添加也在這一層,比如從A扣掉100,再從B加上100,這個過程在Service層打包成了一個事務。
3. 注解
初次學習的時候,接觸了太多的注解了,一方面感慨java后端就是面向注解編程,可以幫助我們快速構建應用程序;另一方面覺得對底層認值還不夠清晰。這一小節把常用的注解都記錄下來總結一下。
3.1 @SpringBootApplication
作用:這是一個組合注解,包括了@Configuration、@EnableAutoConfiguration和@ComponentScan三個注解。用于標識SpringBoot應用程序的入口類。
-
@Configuration:指示這個類是一個配置類,它定義了一個或多個@Bean方法,用于創建和配置Spring應用程序上下文中的Bean。
-
@EnableAutoConfiguration:啟用Spring Boot的自動配置機制,它會自動添加所需的依賴項和配置,以使應用程序能夠運行。
-
@ComponentScan:指示Spring Boot掃描當前包及其子包中的所有@Component、@Service、@Repository和@Controller注解的類,并將它們注冊為Spring Bean。
@SpringBootApplication注解通常被用于Spring Boot應用程序的入口類上,用于啟動Spring Boot應用程序。它可以簡化Spring應用程序的配置和啟動過程。
3.2 Bean對象的聲明
作用:把某個對象交給IOC容器管理。即完成控制反轉。
注解 | 說明 | 位置 |
---|---|---|
@Component | 聲明bean的基礎注解 | 不屬于以下三類時,用此注解 |
@Controller | @Component的衍生注解 | 標注在控制器類上 |
@Service | @Component的衍生注解 | 標注在業務類上 |
@Mapper | @Component的衍生注解 | 標注在Mapper上 |
在springboot中,控制類用@RestController,該類不僅包含了@Controller,還可以將返回值類轉換為json類型給前端。
3.3 @Autowired
作用:用于自動裝配Spring容器中的Bean。即完成依賴注入。
3.4 @RequestBody
作用:用于將HTTP請求的主體轉換為方法的參數。@RequestBody是Spring MVC框架中的一個注解,用于將HTTP請求體中的數據綁定到控制器方法的參數上。需要注意,后端pojo類的參數名要與傳入的參數名一致。
@RestController
@RequestMapping("/api")
public class UserController {@PostMapping("/users")public User createUser(@RequestBody User user) {// 創建用戶}
}
3.5 @ResponseBody
作用:用于將方法的返回值轉換為HTTP響應的主體。@ResponseBody是Spring MVC框架中的一個注解,用于將控制器方法的返回值轉換為HTTP響應體中的數據。
3.6 @PathVariable
作用:用于獲取URL中的參數值。@PathVariable是Spring MVC框架中的一個注解,用于將HTTP請求路徑中的變量綁定到控制器方法的參數上。
@DeleteMapping("/{id}")public Result delete(@PathVariable Integer id) {log.info("根據id刪除部門:{}", id);deptService.delete(id);return Result.success();
}
3.7 @RequestParam
作用:用于獲取請求參數的值,如果未聲明則參數和變量參數名一樣;同時還可以用defaultValue設置默認值。
@GetMappingpublic Result page(@RequestParam(defaultValue = "1") Integer page,@RequestParam(defaultValue = "10") Integer pageSize,String name, Short gender,@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin, @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {log.info("分頁查詢,參數:{}, {}", page, pageSize);PageBean pageBean = empService.page(page, pageSize, name, gender, begin, end);return Result.success(pageBean);
}
3.8 @RequestMapping、@GetMapping、@@PostMapping等等
用于處理HTTP的各種請求。
3.9 @Configuration
作用:用于標識一個類是Spring的配置類。@Configuration是Spring框架中的一個注解,用于標注一個類作為配置類。
3.10 @Import
作用:用于導入其他配置類或Bean。
3.11 @Bean
作用:用于將一個方法返回的對象注冊到Spring容器中。@Bean是Spring框架中的一個注解,用于將一個方法返回的對象注冊為一個Spring Bean。
3.12 @Transactional
作用:用于指定事務的范圍。
3.13 切面
@Aspect
作用:用于定義切面。
@Aspect是Spring框架中的一個注解,用于標識一個類為切面類,從而可以在該類中定義切面邏輯以實現AOP(面向切面編程)。
在Spring框架中,如果需要使用AOP來實現某些功能,我們可以使用@Aspect注解來標識一個類為切面類。在切面類中,我們可以定義切面邏輯,包括切入點、通知類型和切面順序等,從而實現AOP編程的功能。
同時,我們還使用@Component注解標識這個類,以便Spring框架能夠自動將它加入到Spring容器中。
@Pointcut
作用:用于定義切點。
@Pointcut是Spring框架中的一個注解,用于定義一個切入點,從而可以在該切入點上定義通知類型以實現AOP(面向切面編程)。
在Spring框架中,如果需要使用AOP來實現某些功能,我們可以使用@Pointcut注解來定義一個切入點。在切入點上,我們可以定義切面邏輯,包括通知類型和切面順序等,從而實現AOP編程的功能。
@Pointcut("execution(* com.example.UserService.*(..))")
@Before
作用:用于在方法執行前執行通知。
@After
作用:用于在方法執行后執行通知。
@Around
作用:用于在方法執行前后執行通知。
3.14 @Slf4j
作用:用于簡化日志記錄。
3.15 lombok
@Data
作用:用于自動生成JavaBean的getters、setters、toString、hashCode和equals方法。
@NoArgsConstructor
作用:用于生成無參構造函數。
@AllArgsConstructor
作用:用于生成全參構造函數。
總結
感覺學到這雖說把后端的框架都拉通了一遍,但也只是淺嘗輒止。后續還需要做更多的研究才行,未來的安排是通過做黑馬的項目和背八股文來加深理解。今天把這篇博客寫完也算是對這段時間的學習進行了一個總結,然后就準備回家休息幾天了。
References
java三層架構,有圖有案例有代碼,一看就懂!!!
SpringBoot最常用的50個注解(全是干貨,干的要死!)