西安網(wǎng)站建設(shè)維護如何申請一個網(wǎng)站域名
1.什么是IOC和AOP?了解么?
IOC(控制反轉(zhuǎn))和AOP(面向切面編程)
1. IOC(控制反轉(zhuǎn))
概念
????????IOC(Inversion of Control)是面向?qū)ο缶幊讨械囊粋€設(shè)計原則,意味著控制的反轉(zhuǎn)或轉(zhuǎn)移。簡單來說,IOC把對象的創(chuàng)建和依賴關(guān)系的管理交給容器,而不是由程序員手動管理。通過IOC,程序中的組件之間變得松耦合,組件可以獨立測試和維護。
public class Service {private Database database;public Service() {this.database = new Database(); // 這里硬編碼了依賴}public void processData() {database.save();}
}
傳統(tǒng)的創(chuàng)建對象,是我們自己手動來創(chuàng)建的,這樣來說就是高耦合(每次都創(chuàng)建對象,麻煩)
通過 IOC,我們將依賴的對象(如 Database
)從 Service
類中分離出來,由外部容器(比如 Spring 容器)來管理。這樣,Service
類就可以聚焦于業(yè)務(wù)邏輯,容器負責(zé)對象的創(chuàng)建和注入
Spring框架提供了兩種常見的依賴注入方式:
-
構(gòu)造器注入: 通過構(gòu)造函數(shù)注入依賴的對象。
@Component public class Service {private final Database database;@Autowiredpublic Service(Database database) {this.database = database;}public void processData() {database.save();} }
-
Setter注入: 通過setter方法注入依賴的對象。
@Component public class Service {private Database database;@Autowiredpublic void setDatabase(Database database) {this.database = database;}public void processData() {database.save();} }
在開發(fā)過程中呢一般結(jié)合注解,不會手動去創(chuàng)建對象,太麻煩
優(yōu)勢
- 松耦合:減少了類之間的耦合,增加了靈活性。
- 易于測試:可以輕松模擬依賴,便于單元測試。
- 可擴展性:容器可以動態(tài)注入不同的實現(xiàn)類,使得程序更容易擴展。
2. AOP(面向切面編程)
概念
AOP(Aspect-Oriented Programming,面向切面編程)是一種編程范式,旨在將橫切關(guān)注點(cross-cutting concerns)從業(yè)務(wù)邏輯中分離出來。橫切關(guān)注點指的是那些與核心業(yè)務(wù)邏輯無關(guān),但又需要在多個地方執(zhí)行的功能,如日志、性能監(jiān)控、安全控制、事務(wù)管理等。
核心概念
- 切面(Aspect):表示橫切關(guān)注點的模塊化。它可以定義在多個類中應(yīng)用的邏輯(如日志記錄、事務(wù)管理等)。
- 連接點(Join Point):是程序執(zhí)行的一個點,通常是方法調(diào)用。AOP可以在這些點上執(zhí)行特定的動作。
- 通知(Advice):是橫切邏輯的具體實現(xiàn)。通知可以在切入點前(before)、后(after)或方法執(zhí)行拋出異常時(around)執(zhí)行。
- 切入點(Pointcut):是AOP應(yīng)用到哪些方法的定義。通過切入點表達式來指定切面的作用范圍。
- 織入(Weaving):將切面應(yīng)用到目標對象(或類)上的過程??椚肟梢园l(fā)生在編譯時、類加載時或運行時。
2.這個核心概念了解就行了,重要的是如何去應(yīng)用,這時候面試官會問你,你在哪些場景會用到AOP?你是怎么用的呢??
Spring中的AOP實現(xiàn)
Spring AOP是基于代理的,它可以通過動態(tài)代理或CGLIB代理來實現(xiàn)。常見的使用場景包括:
- 事務(wù)管理:自動處理方法執(zhí)行前后事務(wù)的提交與回滾。
- 日志記錄:在方法調(diào)用前后自動記錄日志。
- 性能監(jiān)控:監(jiān)控方法執(zhí)行的時間。
你可以說,我之前的項目,在寫日志的時候用到過。。。。自己去查怎么用的不想全寫,寫一個日志的吧
(1)創(chuàng)建要執(zhí)行業(yè)務(wù)的方法
import org.springframework.stereotype.Service;@Service
public class MyService {public void processData() {System.out.println("吃飯!干飯!");}public void saveData() {System.out.println("睡覺!");}
}
?(2)定義日志切面(Aspect)
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;
import org.springframework.stereotype.Component;@Aspect
@Component
public class LoggingAspect {// 記錄方法調(diào)用前的日志@Before("execution(* com.example.service.MyService.*(..))")public void logBefore(JoinPoint joinPoint) {System.out.println("Before method: " + joinPoint.getSignature().getName());}// 記錄方法調(diào)用后的日志@After("execution(* com.example.service.MyService.*(..))")public void logAfter(JoinPoint joinPoint) {System.out.println("After method: " + joinPoint.getSignature().getName());}
}
@Aspect
:標記該類為一個切面類,Spring會自動識別并將它作為AOP配置的一部分。@Component
:使切面類成為Spring容器的一個組件,這樣Spring可以自動管理它。@Before
:表示在目標方法執(zhí)行之前執(zhí)行logBefore
方法。execution(* com.example.service.MyService.*(..))
是一個切點表達式,表示我們要在MyService
類中的所有方法執(zhí)行前記錄日志。@After
:表示在目標方法執(zhí)行之后執(zhí)行logAfter
方法。
JoinPoint
是AOP框架中的一個重要對象,表示方法執(zhí)行的連接點,它可以獲取方法的簽名、參數(shù)等信息。
(3)配置Spring AOP
如果你使用的是Spring Boot,Spring AOP默認已啟用,無需額外配置。如果是傳統(tǒng)的Spring項目,確保在applicationContext.xml
中啟用AOP支持:
<!-- 啟用AOP支持 -->
<aop:aspectj-autoproxy /><!-- 配置切面 -->
<bean id="loggingAspect" class="com.example.aspect.LoggingAspect" />
(4)測試。。。
在Spring中,IOC和AOP通常是一起使用的。IOC負責(zé)管理對象的創(chuàng)建與依賴注入,而AOP則提供了一種機制,用于在不改變業(yè)務(wù)邏輯的前提下,增加額外的功能(如日志、事務(wù)管理等)
2.SpringBoot常用注解有哪些?
@RestController(@Controller
和 @ResponseBody
的組合注解)
@RestController
public class UserController {@GetMapping("/users")public List<User> getUsers() {return userService.getAllUsers();}@PostMapping("/users")public void createUser(@RequestBody User user) {userService.createUser(user);}
}
@Autowired、. @Component / @Service / @Controller
@Value
- 用途:用于注入來自
application.properties
或application.yml
文件中的配置值??梢宰⑷胱址?、數(shù)字、布爾值等基本類型的數(shù)據(jù)。@Value("${server.port}") private String serverPort;
@Transactional
- 用途:聲明方法或類的事務(wù)管理,確保在方法執(zhí)行過程中發(fā)生的所有數(shù)據(jù)庫操作要么全部成功,要么全部失敗回滾。
@CrossOrigin
- 用途:用于啟用跨域支持,允許其他域名的客戶端訪問本應(yīng)用程序。通常用于 REST API 服務(wù)中。
@EnableScheduling
- 用途:用于啟用 Spring 的任務(wù)調(diào)度功能,可以讓 Spring Boot 應(yīng)用程序支持定時任務(wù)。
@EnableScheduling
public class SchedulerConfig {@Scheduled(fixedRate = 5000)public void task() {System.out.println("This task runs every 5 seconds");}
}
3.什么情況下事務(wù)會失效?
(1)訪問權(quán)限問題:private
修飾方法這樣會導(dǎo)致事務(wù)失效,spring 要求被代理方法必須是public
的。
(2)方法用 final 修飾?
(3)方法內(nèi)部調(diào)用:有時候我們需要在某個 Service 類的某個方法中,調(diào)用另外一個事務(wù)方法
具體查看
spring 事務(wù)失效的 12 種場景_spring 截獲duplicatekeyexception 不拋異常-CSDN博客