spring常用註解
註解開發
1)註解驅動的意義
1.1)什麼是註解驅動
註解啟動時使用註解的形式替代xml配置,將繁雜的spring配置檔案從工程中徹底消除掉,簡化書寫
1.2)註解驅動的弊端
-
為了達成註解驅動的目的,可能會將原先很簡單的書寫,變的更加複雜
-
XML中配置第三方開發的資源是很方便的,但使用註解驅動無法在第三方開發的資源中進行編輯,因此會增大開發工作量
2)常用註解
2.1)啟動註解功能
啟動註解掃描,載入類中配置的註解項
<context:component-scan base-package="packageName"/>
-
說明:
-
在進行包所掃描時,會對配置的包及其子包中所有檔案進行掃描
-
掃描過程是以資料夾遞迴迭代的形式進行的
-
掃描過程僅讀取合法的java檔案
-
掃描時僅讀取spring可識別的註解
-
掃描結束後會將可識別的有效註解轉化為spring對應的資源加入IoC容器
-
-
注意:
-
無論是註解格式還是XML配置格式,最終都是將資源載入到IoC容器中,差別僅僅是資料讀取方式不同
-
從載入效率上來說註解優於XML配置檔案
-
2.2)bean的定義
-
名稱:@Component @Controller @Service @Repository
-
型別:類註解
-
位置:類定義上方
-
作用:設定該類為spring管理的bean
-
範例:
@Componentpublic class ClassName{}
-
說明:
-
@Controller、@Service 、@Repository是@Component的衍生註解,功能同@Component
-
-
相關屬性
-
value(預設):定義bean的訪問id
-
2.3)bean的作用域
-
名稱:@Scope
-
型別:類註解
-
位置:類定義上方
-
作用:設定該類作為bean對應的scope屬性
-
範例:
@Scope public class ClassName{}
-
相關屬性
-
value(預設):定義bean的作用域,預設為singleton
-
2.4)bean的生命週期
-
名稱:@PostConstruct、@PreDestroy
-
型別:方法註解
-
位置:方法定義上方
-
作用:設定該類作為bean對應的生命週期方法
-
範例:
@PostConstruct public void init() { System.out.println("init..."); }
2.5)載入第三方資源
-
名稱:@Bean
-
型別:方法註解
-
位置:方法定義上方
-
作用:設定該方法的返回值作為spring管理的bean
-
範例:
@Bean("dataSource") public DruidDataSource createDataSource() { return ……; }
-
說明:
-
因為第三方bean無法在其原始碼上進行修改,使用@Bean解決第三方bean的引入問題
-
該註解用於替代XML配置中的靜態工廠與例項工廠建立bean,不區分方法是否為靜態或非靜態
-
@Bean所在的類必須被spring掃描載入,否則該註解無法生效
-
-
相關屬性
-
value(預設):定義bean的訪問id
-
2.6)bean的非引用型別屬性注入
-
名稱:@Value
-
型別:屬性註解、方法註解
-
位置:屬性定義上方,方法定義上方
-
作用:設定對應屬性的值或對方法進行傳參
-
範例:
@Value("${jdbc.username}") private String username;
-
說明:
-
value值僅支援非引用型別資料,賦值時對方法的所有引數全部賦值
-
value值支援讀取properties檔案中的屬性值,通過類屬性將properties中資料傳入類中
-
value值支援SpEL
-
@value註解如果新增在屬性上方,可以省略set方法(set方法的目的是為屬性賦值)
-
-
相關屬性
-
value(預設):定義對應的屬性值或引數值
-
2.7)bean的引用型別屬性注入
-
名稱:@Autowired、@Qualifier
-
型別:屬性註解、方法註解
-
位置:屬性定義上方,方法定義上方
-
作用:設定對應屬性的物件或對方法進行引用型別傳參
-
範例:
@Autowired(required = false) @Qualifier("userDao") private UserDao userDao;
-
說明:
-
@Autowired預設按型別裝配,指定@Qualifier後可以指定自動裝配的bean的id
-
-
相關屬性
-
required:定義該屬性是否允許為null
-
2.8)bean的引用型別屬性注入
-
名稱:@Primary
-
型別:類註解
-
位置:類定義上方
-
作用:設定類對應的bean按型別裝配時優先裝配
-
範例:
@Primary public class ClassName{}
-
說明:
-
@Autowired預設按型別裝配,當出現相同型別的bean,使用@Primary提高按型別自動裝配的優先順序,多個@Primary會導致優先順序設定無效
-
2.9)bean的引用型別屬性注入
-
名稱:@Inject、@Named、@Resource
-
說明:
-
@Inject與@Named是JSR330規範中的註解,功能與@Autowired和@Qualifier完全相同,適用於不同架構場景
-
@Resource是JSR250規範中的註解,可以簡化書寫格式
-
-
@Resource相關屬性
-
name:設定注入的bean的id
-
type:設定注入的bean的型別,接收的引數為Class型別
-
2.10)載入properties檔案
-
名稱:@PropertySource
-
型別:類註解
-
位置:類定義上方
-
作用:載入properties檔案中的屬性值
-
範例:
@PropertySource(value = "classpath:filename.properties") public class ClassName { @Value("${propertiesAttributeName}") private String attributeName; }
-
說明:
-
不支援*通配格式,一旦載入,所有spring控制的bean中均可使用對應屬性值
-
-
相關屬性
-
value(預設):設定載入的properties檔名
-
ignoreResourceNotFound:如果資源未找到,是否忽略,預設為false
-
2.11)純註解格式
-
名稱:@Configuration、@ComponentScan
-
型別:類註解
-
位置:類定義上方
-
作用:設定當前類為spring核心配置載入類
-
範例:
@Configuration @ComponentScan("scanPackageName") public class SpringConfigClassName{ }
-
說明:
-
核心配合類用於替換spring核心配置檔案,此類可以設定空的,不設定變數與屬性
-
bean掃描工作使用註解@ComponentScan替代
-
AnnotationConfigApplicationContext
-
載入純註解格式上下文物件,需要使用AnnotationConfigApplicationContext
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
2.12)第三方bean配置與管理
-
名稱:@Import
-
型別:類註解
-
位置:類定義上方
-
作用:匯入第三方bean作為spring控制的資源
-
範例:
@Configuration @Import(OtherClassName.class) public class ClassName { }
-
說明:
-
@Import註解在同一個類上,僅允許新增一次,如果需要匯入多個,使用陣列的形式進行設定
-
在被匯入的類中可以繼續使用@Import匯入其他資源(瞭解)
-
@Bean所在的類可以使用匯入的形式進入spring容器,無需宣告為bean
-
3)bean載入控制
3.1)依賴載入
(1)@DependsOn
-
名稱:@DependsOn
-
型別:類註解、方法註解
-
位置:bean定義的位置(類上或方法上)
-
作用:控制bean的載入順序,使其在指定bean載入完畢後再載入
-
範例:
@DependsOn("beanId") public class ClassName { }
-
說明:
-
配置在方法上,使@DependsOn指定的bean優先於@Bean配置的bean進行載入
-
配置在類上,使@DependsOn指定的bean優先於當前類中所有@Bean配置的bean進行載入
-
配置在類上,使@DependsOn指定的bean優先於@Component等配置的bean進行載入
-
-
相關屬性
-
value(預設):設定當前bean所依賴的bean的id
-
(2)@Order
-
名稱:@Order
-
型別:配置類註解
-
位置:配置類定義的位置(類上)
-
作用:控制配置類的載入順序
-
範例:
@Order(1) public class SpringConfigClassName { }
(3)@Lazy
-
名稱:@Lazy
-
型別:類註解、方法註解
-
位置:bean定義的位置(類上或方法上)
-
作用:控制bean的載入時機,使其延遲載入
-
範例:
@Lazy public class ClassName { }
3.2)依賴載入應用場景
@DependsOn
-
微信訂閱號,釋出訊息和訂閱訊息的bean的載入順序控制
-
雙11活動期間,零點前是結算策略A,零點後是結算策略B,策略B操作的資料為促銷資料。策略B載入順序與促銷資料的載入順序
@Lazy
-
程式災難出現後對應的應急預案處理是啟動容器時載入時機
@Order
-
多個種類的配置出現後,優先載入系統級的,然後載入業務級的,避免細粒度的載入控制