spring作用、spring注解、管理對象的作用域與生命周期、自動裝配、Spring的框架包有哪些作用是什么


Spring

1. 作用

創建和管理對象,使得開發過程中,可以不必使用new關鍵字創建對象,而是直接獲取對象!並且,還可以通過一些配置,使得某些獲取到的對象,其中某些屬性已經是被賦值的!

2. Spring注解

在Spring中,定義了一系列的注解,可以取代幾乎所有的XML配置!

盡管使用注解可以完成此前的許多配置,但是,基於Spring的項目仍需要Spring的配置文件!

2.1. 常用注解

使用注解的方式來創建和管理對象,首先,必須在Spring的配置文件中添加組件掃描:

<!-- 組件掃描 -->
<!-- 僅在組件掃描的包下的類,才會被Spring管理 -->
<!-- 某個類,如果在掃描范圍中,且添加了注解,則會被Spring管理 -->
<!-- base-package:掃描的根包 -->
<!-- 根包:父級包,Spring掃描時,會掃描其各層級子包 -->
<!-- 當配置為cn.tedu.spring時 -->
<!-- cn.tedu.spring.dao或cn.tedu.spring.entity這些子包都會被掃描 -->
<context:component-scan 
    base-package="cn.tedu.spring.entity" />

然后,確保需要被管理的類都在以上配置的包中(也可以在其子包中),並且,在類的聲明之前添加注解:

@Component

在默認情況下,被管理的類的bean id是與類的名稱相同,且首字母小寫的!例如類名是User,則默認的bean id是user,或類名是UserDao,則默認的bean id是userDao

如果需要自定義bean id,可以在注解中添加bean id:

@Component("bean-id")

@Component作用相同的注解還有:

@Controller
@Service
@Repository

其中,@Component是通用注解,即對任意類都可以添加該注解,@Controller是對控件器類的注解,@Service是對業務類的注解,@Repository是對持久層類的注解。

不過,以上這4種的作用和使用方式完全相同!只是語義不同,即從語法上表達的意義不相同,應該根據類的定位來選取 其中的某個注解!

2.2. 【了解】管理對象的作用域與生命周期

由Spring所管理的對象,默認都是餓漢式單例的,通過@Scope注解可以配置某個類被Spring管理時,是否是單例的:

@Scope("prototype")
public class ...

常用的配置方式有@Scope("singleton")@Scope("prototype")

如果需要配置該類最終是否是懶加載的,可以使用@Lazy注解,當添加了該注解后,就是懶加載模式,即:只有第1次獲取對象時,才會創建對象,而在加載Spring配置文件的過程中,並不會把對象創建出來!

關於@Lazy也可以配置值,例如@Lazy(true)@Lazy(false)

餓漢式:一開始就已准備好了,隨時都有的吃!

懶漢式:不到逼不得已,不干活!

注意:是否懶加載,是建立在單例的基礎之上的!如果不是單例的,則懶加載的配置是無效的!

作用域:在多大的范圍內是有效的!對於變量/對象而言,作用域就是它存在的時長,即何時創建及何時銷毀!由於單例的對象都是static實現的,也就涉及創建時間和銷毀時間的問題!而非單例的,作用域與普通的局部變量相同!

簡單的懶漢式單例代碼(沒有解決線程安全問題):

public class King {
    private static King king = null;

    private King() {
    }

    public static King getInstance() {
        if (king == null) {
            king = new King();
        }
        return king;
    }

}

由Spring管理的對象,也存在生命周期問題,畢竟單例模式的類的對象何時創建、何時銷毀,是我們無法確定的!為了確保初始化和銷毀工作的正常執行,Spring允許在類中自定義初始化方法和銷毀方法,使用了@PostConstruct注解的方法是生命周期初始化方法,會在構造方法之后被自動調用,使用了@PreDestroy注解的方法是生命周期銷毀方法,會在Spring容器銷毀並釋放資源的前一刻被自動調用。

注意:以上2個方法是在javax包中定義的,使用之前,需要為項目添加Tomcat運行環境,否則無法識別!

注意:以上生命周期方法是建立在單例模式之下的,對於非單例模式而言,以上生命周期方法其實沒有意義!

2.3. 自動裝配

當使用了自動裝配后,由Spring管理的對象時,會自動嘗試為各屬性注入值,值的來源可以是其它bean,例如:

public class UserService {
    public IUserDao userDao;
}

public class UserDao1 implements IUserDao {
}

如果以上2個類都是由Spring管理的,則在創建UserService對象時,會嘗試自動的將UserDao對象作為其屬性值!

自動裝配的常用模式有byNamebyType,前者表示根據名稱來裝配,即:要求bean id與屬性名保持一致,后者表示根據類型來裝配,即bean的類型與屬性的類型保持一致(允許是接口與實現類的關系,也允許是父子級繼承的關系),不過,根據類型裝配,要求匹配該類型的對象必須是有且僅有1個,如果有2個,則會拋出異常,無法裝配!

Spring框架包,分別有哪些作用

Spring-context,上下文,用於緩存,注解,遠程調用等

 

Spring-aop,用於配置面向切面編程,如配置事務的切面,日志切面

Spring-tx,用於配置事務

Spring-web,用於配置在web-xml加載applicationContext配置文件

Spring-mvc,攔截請求,配置控制器


免責聲明!

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



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