主要介紹了Java的Spring框架中的註解編程。第一章首先介紹了註解編程的概念,即在類或方法上添加特定的註解來完成特定功能的開發。然後解釋了為什麼要學習註解編程,主要原因是註解開發方便且與Spring框架的發展潮流相符合。接著介紹了註解的作用,包括替換XML配置和替換介面實現調用雙方的契約性。第四... ...
學習視頻:【孫哥說Spring5:從設計模式到基本應用到應用級底層分析,一次深入淺出的Spring全探索。學不會Spring?只因你未遇見孫哥】
註解編程-第一章、註解基礎概念
1.什麼是註解編程
指的是在類或方法上加入特定的註解(@XXX),完成特定功能的開發.
2.為什麼要講解註解編程
-
註解開發方便
代碼簡介 開發速度大大提高
-
Spring開發潮流
Spring2.x引入註解 Spring3.x完善註解 SpringBoot普及 推廣註解編程
3.註解的作用
-
替換XML這種配置形式,簡化配置
@Component 代替/等效配置中的bean對象
-
替換介面,實現調用雙方的契約性
通過註解的方式,在調用者和功能提供者之間達成約定,進而進行功能的調用,因為註解應用更為方便靈活,所以在現在的開發中,更推薦通過註解的形式完成
4.Spring註解的發展歷程
-
Spring2.x開始支持註解編程 @Component @Service @Scope
目的:提供這些註解只是為了在某些情況簡化XML的配置,作為XML開發的有益補充
-
Spring3.x @Configuration @Bean
目的:徹底替換XML,基於純註解編程
-
Spring4.x SpringBoot
提倡使用註解常見開發
5.Spring註解開發的一個問題
Spring基於註解進行配置後,還能否解耦合呢?
在Spring框架應用註解時,如果對註解配置的內容不滿意,可以通過Spring配置文件進行覆蓋。
第二章、Spring的基礎註解(Spring2.x)
這個階段的註解,僅僅是簡化XML的配置,並不能完全代替XML
1.對象創建相關註解
- 搭建開發環境
<context:component-scan base-package="com.baizhi"/>
作用:讓Spring框架在設置的包下掃描對應的註解,使其生效
-
對象創建相關註解
- @Component
作用:替換原有Spring配置文件中的bean標簽
註意:id屬性 cmponent註解 提供了預設的設置方式 首單詞首字母小寫
class屬性 通過反射獲得class內容
@Component 代替/等效配置中的bean對象
-
@Component細節
如何顯示指定工廠創建對象的id值
@Component("u”) 參數可以設置id值
-
Spring配置文件覆蓋註解配置內容
applicationContext.xml <bean id="u" class="com.baizhi.bean.User"/>
-
-
@Component的衍生註解
@Repository 應用在DAO類型 @Service 應用在Service類 @Controller 應用在Controller類 **註意:本質上這些衍生註解就是@Component 作用、細節、用法都是完全一致 目的:更加準確的表達一個類型的作用 註意:Spring整合Mybatis開發過程中 不使用@Repository @Component**
-
@Scope註解
作用:控制簡單對象創建次數 等同於scope屬性
註意:不添加@Scope,Spring還是會提供預設值singleton
<bean id="" class="" scope="singleton|prototype"/>
-
@Lazy註解
作用:延遲創建單實例對象
註意:一旦使用了@Lazy註解後,Spring會在使用這個對象的時候,才進行對象的創建
<bean id="" class="" lazy="false"/>
-
生命周期方法相關註解
-
初始化相關方法 @PostConstruct
-
銷毀方法 @PreDestroy
註意:1.上述的2個註解並不是Spring提供的,是JSR(JavaEE規範)520提供的
**2.再一次的驗證,通過註解實現了介面的契約性**
-
2.註入相關註解
-
用戶自定義類型註入 @Autowired
@AutoWired細節
-
Autowired註解基於類型進行註入[推薦]
基於類型的註入:註入對象的類型,必須與目標成員變數類型相同或者是其子類(實現類)
-
Autowired加上Qualifier 可以基於名字進行註入[瞭解即可]
註入對象id值,必須與Qualifier註解中設置的名字相同
-
Autowired註解放置位置
- 放置在對應成員變數的set方法上
- 直接把這個註解放置在成員變數之上,Spring通過反射直接對成員變數進行註入(賦值)[推薦]
-
JavaEE規範中提供類似功能的註解
JSR250 @Resouce(name=”userDAOImpl”) 基於名字進行註入
註意:應用Resource註解時,名字沒有配置成功,那麼他會繼續按照類型進行註入
JSR330 @Inject 作用 @Autowired完全一致 基於類型進入註入 —→EJB3.0
-
-
JDK類型
@Value註解完成
-
設置xxx.properties
id = 10
name = suns
-
Spring的工廠讀取這個配置文件
<context:property-placeholder location=””/>
-
代碼
屬性 @Value("${key}”)
- @PropertySource
- 作用:用於替換Spring配置文件中的<context:property-placeholder location=””/>標簽
- 開發步驟
-
設置xxx.properties
id=10
name=suns
-
應用@PropertySource
-
代碼
屬性@Value()
-
-
@Component
@PropertySource("classpath:/init.properties")
public class Category {
@Value("${id}")
private Integer id;
@Value("${name}")
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
- @Value註解細節
- @Value註解不能給靜態成員變數賦值
- @Value註解+Properties這種方式,不能註入集合類型
- Spring提供新的配置形式 YAML YML(SpringBoot)
3.註解掃描詳解
<context:component-scan base-package="com.baizhi"/>
當前包 及其 子包
1.排除方式
<context:component-scan base-package="com.baizhi">
<context:exclude-filter **type**="" expression=""/>
**type參數講解**:assignable:排除特定的類型 不進行掃描
annotation:排除特定的註解 不進行掃描
aspectj:切入點表達式
包切入點:com.baizhi.bean..*
類切入點:*.User
regex:正則表達式來進行排除
custom:自定義排除策略
</context:component>
排除策略可以疊加使用
<context:component-scan base-package="com.baizhi">
<context:exclude-filter type="assignable" expression="com.baizhi.bean.User"/>
<context:exclude-filter type="aspectj" expression="com.baizhi.injection..*"/>
</context:component-scan>
實際開發中常用assignable、annotation、 aspectj(用的最多,切入點表達式)更方便
2.包含方式
和排除方式是相反的,它決定了哪些類的註解被Spring掃描
<context:component-scan base-package="com.baizhi" use-default-filters="false">
<context:include-filter type="" expression=""/>
</context:component-scan>
1. use-default-filters="false"
作用:讓Spring預設的註解掃描方式 失效
2. <context:include-filter type="" expression=""/>
作用:指定掃描那些註解
type:assignable:指定特定的類型 不進行掃描
annotation:指定特定的註解 不進行掃描
aspectj:切入點表達式
包切入點:com.baizhi.bean..*
類切入點:*.User
regex:正則表達式來進行排除
custom:
包含的方式支持疊加
<context:component-scan base-package="com.baizhi" use-default-filters="false">
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
4.對於註解開發的思考
-
配置互通
Spring註解配置 配置文件的配置 互通
@Repository public class UserDAOImpl{ } public class UserServiceImpl{ private UserDAO userDAO; set get.. } <bean id="userService class="com.baizhi.UserServiceImpl"> <property name="userDAO" ref=""/>ref會提示userDAO的選項 </bean>
-
什麼情況下使用註解 什麼情況下使用配置文件
@Component 替換 <bean
基礎註解(@Component @Autowired @Value) 程式員開發類型的配置
-
在程式員開發的類型上 可以加入對應註解 進行對象的創建
User UserService UserDAO UserAction
-
應用其他非程式員開發的類型時,還是需要<bean 進行配置的
SqlSessionFactoryBean MapperScannerConfigure
-
作者:揚眉劍出鞘
出處: https://www.cnblogs.com/eyewink/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。