Spring純註解開發模式讓開發簡化更簡化
一.註解開發
以前跟老韓學習SE時他就說:
註解本質是一個繼承瞭Annotation 的特殊接口,其具體實現類是Java 運行時生成的動態代理類。
而我們通過反射獲取註解時,返回的是Java 運行時生成的動態代理對象$Proxy1。通過代理對象調用自定義註解(接口)的方法,會最終調用AnnotationInvocationHandler 的invoke 方法。該方法會從memberValues 這個Map 中索引出對應的值。而memberValues 的來源是Java 常量池。
二.註解定義Bean
註解開發前,配置Bean時是在xml裡將class分別寫在Bean標簽裡,然後起id,就像這樣
<bean id="a" class="yu7daily.Dao.Daoimpl.A" />
註解開發後,配置Bean時首先將xml裡的<Bean>標簽刪掉,然後在類上添加@Component註解即可
@Component("a") public class A implements AA { public void save() { System.out.println("book dao save ..." ); } }
在xml文件中來寫一個掃描包的註解標簽,對象就裝進IOC容器裡瞭
<context:component-scan base-package="yu7daily.Dao"/>
component-scan:component意為組件,scan意為掃描
包路徑越多,掃描的范圍越小速度越快·包路徑越少,掃描的范圍越大速度越慢
最後直接從容器獲取對象
public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); A aa = (A) ctx.getBean("a"); bookService.save(); }
這裡要註意的是:由於接口無法創建對象,所以別把註解寫在接口上!!
註解真是神奇啊,他和原先的xml裡的Bean到底是什麼關系呢?
三.衍生註解
對於@Component還有衍生的三個註解:
@Controller、@Service、@Repository
結合與MVC的模式分別起到瞭補充的作用,方便我們後期在編寫類的時候能很好的區分出這個類是屬於表現層、業務層還是數據層的類
四.純註解開發模式
顧名思義,純註解的模式就是摒棄以前的配置操作,全部由註解來完成
@Configuration:類註解,設置該類為Spring配置類
@ComponentScan:類註解,設置Spring配置類掃描路徑
1.寫一個配置類,通過註解@Configuration來標註該類為配置類、@ComponentScan來配置包掃描
這樣就替換掉瞭<context:component-scan base-package="yu7daily.Dao"/>
@Configuration @ComponentScan("yu7daily") public class Config {...}
然後類就被放進瞭Bean裡,通過
ApplicationContext acct = new AnnotationConfigApplicationContext(Config.class);
就可以得到Bean
一頓操作下來我們通過一個Java類替換掉瞭Spring的核心配置文件,完全告別瞭xml!
配置Bean作用域
我們知道,通過Bean造的對象默認都是單例的,如何造出非單例的Bean?
通過@Scope註解即可,屬性值(默認singleton(單例),可選值prototype(非單例))
@Component("a") @Scope("prototype") public class A implements AA { public void save() { System.out.println("hello~"); } }
五.註解實現註入
Set註入的原理是通過set方法在容器內部將一個類設置到另一個類中,這也是比較常用的方法。那麼在純註解開發的模式下如何實現註入呢?
@Service public class A implements AA { @Autowired private B b; }
如上,通過在屬性上添加註解@Autowired就實現瞭將B註入到A中
1.自動裝配
在前面寫配置文件的階段autowire屬性可以開啟自動裝配,通常使用按類型裝配autowire="byType"
對於自動裝配的理解:在set註入的基礎上配置文件寫的更加簡潔,因為在Service裡寫瞭set方法把Dao的對象搞到瞭Service裡,所以在配置Bean的時候我們通過自動裝配,在xml文件裡實現瞭Service和Dao自動結合,不再需要去Service裡通過property標簽來指定相應的name-ref
自動裝配基於反射設計創建對象並通過暴力反射為私有屬性進行設值普通反射隻能獲取public修飾的內容,暴力反射除瞭獲取public修飾的內容還可以獲取private修改的內容,註解的模式就是體現形式的變式,自動裝配本質還是沒有變
2.按名稱註入
針對相同類型的Bean如果IOC中存在多個,那按照類型註入一定會出錯,就像這樣
我通過註解註入的方式,註入瞭兩個AA的實現類到B中,然後通過B來調用AA接口下的save()方法講道理應該輸出“hello~A”,結果出現瞭NoUniqueBeanDefinitionException
可見按照類型註入還是存在弊端啊,如何解決?
我們可以通過按照名稱註入的方式:
當根據類型在容器中找到多個bean,註入參數的屬性名又和容器中bean的名稱不一致,這個時候該如何解決,就需要使用到註解@Qualifier 來指定註入哪個名稱的bean對象,在不修改其他條件下,就像這樣
@Repository("b") public class B implements BB { @Autowired @Qualifier("a") //註入指定的對象名稱 private AA aa; public void save() { aa.save(); } }
隨著運行結果,輸出瞭A的成員方法,說明註入成功!
值得註意的是:@Qualifier不能獨立使用,必須和@Autowired一起使用!!!
3.簡單數據註入
通過註解@value可以實現簡單數據註入,以String類型數據為例
@Repository("a") public class A implements AA { @Value("hello java") private String str; public void save() { System.out.println(str); } }
運行結果:hello
其實上述操作看起來有點多此一舉,@value主要還是為瞭讀取配置文件而服務的
4.讀取properties配置文件
首先在配置類上寫上註解@PropertySource用來指明讀取目錄下的哪個文件
@Configuration @ComponentScan("yu7daily") @PropertySource("test.properties") public class SpringConfig { }
在相應的屬性上配置@Value註解即可完成配置文件屬性的讀取
PS:配置文件內容——name=lanyangyang
@Repository("a") public class A implements AA { @Value("${name}") private String str; public void save() { System.out.println(str); } }
運行結果:lanyangyang
其實讀取配置文件連接數據庫也是這套操作
六.Spring整合MyBatis
在配置好MyBatis的基礎上(不熟悉的可以去看一下以前寫的MyBatis文章),Spring的整合工作就變的非常簡單,主要工作就是管理MyBatis中的SqlSessionFactory和Mapper接口的掃描
1.首先導入兩個整合需要的的jar包:
<artifactId>spring-jdbc</artifactId>
和13<artifactId>mybatis-spring</artifactId>
2.配置數據源對象
2.創建主配置類
@Configuration @ComponentScan("yu7daily") @PropertySource("classpath:jdbc.properties") 4@Import({JdbcConfig.class,MybatisConfig.class}) public class SpringConfig {...}
3.創建MyBatis配置類並獲得SqlSessionFactory對象
4.最後在主函數中得到對應的Bean即可進行對數據層的操作
ApplicationContext ACC = new AnnotationConfigApplicationContext(SpringConfig.class); AccountService acc = ACC.getBean(AccountService.class);
這工作量比原來是不是簡單多瞭,簡直太哇塞瞭
到此這篇關於Spring純註解開發模式讓開發簡化更簡化的文章就介紹到這瞭,更多相關Spring註解開發內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 關於spring中單例Bean引用原型Bean產生的問題及解決
- Spring入門到精通之Bean標簽詳解
- Java Spring框架簡介與Spring IOC詳解
- Spring超詳細講解IOC與解耦合
- spring IOC控制反轉原理詳解