面試刷題30:SpringBean的生命周期?


image.png

spring是Java軟件開發的事實標准。

我是李福春,我在准備面試,今天的問題是:springBean的生命周期是怎樣的?

答:spring最基礎的能力是IOC(依賴注入),AOP(面向切面編程),ioc改善了模塊之間的耦合問題,

依賴注入的方式:set方法,構造方法,成員變量+ @Autowire  ;Bean的管理是IOC的主要功能。

bean的生命周期完全由spring容器管理,從屬性設置到各種依賴關系的注入,簡化了開發人員對bean的生命周期認知;

Spring的容器中Bean生命周期如下:

對象創建

1,從xml配置的Bean,@Bean注解,或者Java代碼BeanDefinitionBuilder中讀取Bean的定義,實例化Bean對象;

2,設置Bean的屬性;

3,注入Aware的依賴(BeanNameAware,BeanFactoryAware,ApplicationContextAware);

4, 執行通用的方法前置處理,方法: BeanPostProcessor.postProcessorBeforeInitialization()

5, 執行 InitalizingBean.afterPropertiesSet() 方法

6,執行Bean自定義的初始化方法init,或者 @PostConstruct 標注的方法;

7,執行方法BeanPostProcessor.postProcessorAfterInitialization()

8, 創建對象完畢;

對象銷毀

9, 執行 DisposableBean.destory() 方法;

10,執行自定義的destory方法或者 @PreDestory 標注的方法;

11,銷毀對象完畢

下面擴展一下spring的bean關聯面試問題。

Bean的作用域

file

面向切面編程

aop:為了java的應用更好的模塊化,解決程序中的事務,安全,日志等問題;

使用java的動態代理(接口代理)或者CGlib(擴展代理類)實現。

image.png

主要元素如下圖:

Aspect: 定義切面 , Advice定義增強,增強的類型見上圖;

pointcut: 切點,即切入哪些類的哪些方法;

image.png

spring應用中使用AOP的實例代碼:

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

import java.lang.reflect.Method

/**
 * 服務層AOP
 */
@Aspect
@Service
@Order(0)
@Slf4j
public class ServiceInterceptor {

    @Pointcut("execution(public * com.xxx.ihs.yyy.admin.manager..*.*(..))")
    public void pointcut() {
    }

    private String serviceName() {
        return "xxxrest";
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
       
        Method method = ((MethodSignature) pjp.getSignature()).getMethod();
        final String methodName = method.getDeclaringClass().getCanonicalName().concat(".").concat(method.getName());
        Object[] args = pjp.getArgs();
        Object returnObj = null;
        try {
            returnObj = pjp.proceed();
        } catch (Exception ex) {
            String message = String.format("[%s]服務發生系統錯誤:%s", this.serviceName(), ex.getMessage());
            log.error("{}, method:{},args:{}", message, methodName, JsonUtils.toJson(args),  ex);
            throw ex;
        } 
        return returnObj;
    }
}

小結

本篇回答了spring的ioc容器的Bean生命周期的過程。

然后簡單的說明了一下Bean的作用范圍;

最后說到了AOP,簡要的介紹了使用的場景,切入流程以及一個使用實例。

image.png

原創不易,點贊關注支持一下吧!轉載請注明出處,讓我們互通有無,共同進步,歡迎溝通交流。
我會持續分享Java軟件編程知識和程序員發展職業之路,歡迎關注,我整理了這些年編程學習的各種資源,關注公眾號‘李福春持續輸出’,發送'學習資料'分享給你!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM