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
對象作為其屬性值!
自動裝配的常用模式有byName
和byType
,前者表示根據名稱來裝配,即:要求bean id與屬性名保持一致,后者表示根據類型來裝配,即bean的類型與屬性的類型保持一致(允許是接口與實現類的關系,也允許是父子級繼承的關系),不過,根據類型裝配,要求匹配該類型的對象必須是有且僅有1個,如果有2個,則會拋出異常,無法裝配!
Spring框架包,分別有哪些作用
Spring-context,上下文,用於緩存,注解,遠程調用等
Spring-aop,用於配置面向切面編程,如配置事務的切面,日志切面
Spring-tx,用於配置事務
Spring-web,用於配置在web-xml加載applicationContext配置文件
Spring-mvc,攔截請求,配置控制器