java面试常见问题
spring:
1、spring的@configration與@bean和@component其他注解的區別?
- @configration是通過cglib的代理產生對象。(cglib的代理通過集成代理類,并注入beanFactory獲取對象。)
- @configration確保產生對象的單例性。
- @componet調用創建類中的構造方法,創建實例,與普通創建實例一樣。(就是new一個實例)
- @Component注解表明一個類會作為組件類,并告知Spring要為這個類創建bean。
- @Bean注解告訴Spring這個方法將會返回一個對象,這個對象要注冊為Spring應用上下文中的bean。通常方法體中包含了最終產生bean實例的邏輯。
2、spring的生命周期和作用于?
Spring框架中Bean的5個作用域
- singleton單例:是spring默認缺省的,全局只有一個對象。
- prototype原型:每次都是新的Bean實例,有狀態的Bean建議用此類型。相當于new 實例。
- request:一次Http請求中,容器返回同一實例Bean,僅在當前Http Request內有效
- session:一次Http Session中,容器返回同一實例Bean,僅在當前Session內有效。
- global session:一個全局的Http Session中,容器返回同一個實例Bean。
spring的生命周期
Spring容器可以管理singleton作用域下Bean的生命周期,在此作用域下,Spring能夠精確地知道Bean何時被創建,何時初始化完成,以及何時被銷毀。而對于prototype作用域的Bean,Spring只負責創建,當容器創建了Bean的實例后,Bean的實例就交給了客戶端的代碼管理,Spring容器將不再跟蹤其生命周期,并且不會管理那些被配置成prototype作用域的Bean的生命周期。
1.Spring對Bean進行實例化(默認是單例)
2.Spring對Bean進行依賴注入(常用Setter)
3.如果bean視線里BeanNameAware接口,則容器將bean的id傳給setBeanName()方法
4.如果bean實現了BeanFactoryAware接口,則spring調用setBeanFactory()方法,將BeanFactory實例傳遞進來
5.如果bean實現了ApplicationContextAware接口,其setApplicationContext()將會調用,將上下文的引用傳入bean
6.如果bean實現了BeanPostProcesser接口,其postProcessBeforeInitializaition方法將會被調用
7.如果bean實現了InitializingBean接口,spring將調用它的afterPropertiesSet接口方法,類似的如果bean使用了init-method屬性聲明了初始化方法,該方法也會被調用;
8.如果bean實現了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法將被調用;
9.此時bean已經準備就緒,可以被應用程序使用了,他們將一直駐留在應用上下文中,直到該應用上下文被銷毀;
10.若bean實現了DisposableBean接口,spring將調用它的distroy()接口方法。同樣的,如果bean使用了destroy-method屬性聲明了銷毀方法,則該方法被調用;
3、Spring單例bean與線程安全?
Spring使用ThreadLocal解決線程安全問題。
spring中bean分為有狀態和無狀態,只有有狀態的bean才會有線程安全的問題。
-
有狀態就是有數據存儲功能。有狀態對象(Stateful Bean),就是有實例變量的對象,可以保存數據,是非線程安全的。
-
無狀態就是一次操作,不能保存數據。無狀態對象(Stateless Bean),就是沒有實例變量的對象.不能保存數據,是不變類,是線程安全的。
ThreadLocal會為每一個線程提供一個獨立的“變量副本”,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。
java線程同步的方法和什么情況下進行線程同步
ThreadLocal和線程同步機制(synchronized)都可以解決多線程中“相同變量”的訪問沖突問題。
-
線程同步機制(synchronized)通過“對象鎖”,保證同一時間只有一個線程訪問變量,讓不同的線程排隊訪問。這時該變量是多個線程共享的,使用同步機制要求程序慎密地分析什么時候對變量進行讀寫,什么時候需要鎖定某個對象,什么時候釋放對象鎖等繁雜的問題,程序設計和編寫難度相對較大。
-
ThreadLocal會為每一個線程提供一個獨立的“變量副本”,從而隔離了多個線程對數據的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal。
線程安全問題都是由全局變量及靜態變量引起的。若每個線程中對全局變量、靜態變量只有讀操作,而無寫操作,這個全局變量是線程安全的。若有多個線程同時執行寫操作,則需要考慮線程同步,否則就可能影響線程安全。
① 常量始終是線程安全的,因為只存在讀操作。
② 每次調用方法前都新建一個實例是線程安全的,因為不會訪問共享的資源。
③ 局部變量是線程安全的。因為每執行一個方法,都會在獨立的空間創建局部變量,它不是共享的資源。局部變量包括方法的參數變量和方法內變量。
總結
以上是生活随笔為你收集整理的java面试常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发中常使用的方法
- 下一篇: javaweb项目启动后自动查询数据库并