<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
以前跟老韓學習SE時他就說:
註解本質是一個繼承了Annotation 的特殊介面,其具體實現類是Java 執行時生成的動態代理類。
而我們通過反射獲取註解時,返回的是Java 執行時生成的動態代理物件$Proxy1。通過代理物件呼叫自定義註解(介面)的方法,會最終呼叫AnnotationInvocationHandler 的invoke 方法。該方法會從memberValues 這個Map 中索引出對應的值。而memberValues 的來源是Java 常數池。
註解開發前,設定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中
在前面寫組態檔的階段autowire屬性可以開啟自動裝配,通常使用按型別裝配autowire="byType"
對於自動裝配的理解:在set注入的基礎上組態檔寫的更加簡潔,因為在Service裡寫了set方法把Dao的物件搞到了Service裡,所以在設定Bean的時候我們通過自動裝配,在xml檔案裡實現了Service和Dao自動結合,不再需要去Service裡通過property標籤來指定相應的name-ref
自動裝配基於反射設計建立物件並通過暴力反射為私有屬性進行設值普通反射只能獲取public修飾的內容,暴力反射除了獲取public修飾的內容還可以獲取private修改的內容,註解的模式就是體現形式的變式,自動裝配本質還是沒有變
針對相同型別的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一起使用!!!
通過註解@value可以實現簡單資料注入,以String型別資料為例
@Repository("a") public class A implements AA { @Value("hello java") private String str; public void save() { System.out.println(str); } }
執行結果:hello
其實上述操作看起來有點多此一舉,@value主要還是為了讀取組態檔而服務的
首先在設定類上寫上註解@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
其實讀取組態檔連線資料庫也是這套操作
在設定好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註解開發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45