Spring純注解開發(fā)模式讓開發(fā)簡化更簡化
一.注解開發(fā)
以前跟老韓學習SE時他就說:
注解本質(zhì)是一個繼承了Annotation 的特殊接口,其具體實現(xiàn)類是Java 運行時生成的動態(tài)代理類。

而我們通過反射獲取注解時,返回的是Java 運行時生成的動態(tài)代理對象$Proxy1。通過代理對象調(diào)用自定義注解(接口)的方法,會最終調(diào)用AnnotationInvocationHandler 的invoke 方法。該方法會從memberValues 這個Map 中索引出對應的值。而memberValues 的來源是Java 常量池。
二.注解定義Bean
注解開發(fā)前,配置Bean時是在xml里將class分別寫在Bean標簽里,然后起id,就像這樣
<bean id="a" class="yu7daily.Dao.Daoimpl.A" />
注解開發(fā)后,配置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();
}
這里要注意的是:由于接口無法創(chuàng)建對象,所以別把注解寫在接口上!!
注解真是神奇啊,他和原先的xml里的Bean到底是什么關系呢?

三.衍生注解
對于@Component還有衍生的三個注解:
@Controller、@Service、@Repository
結合與MVC的模式分別起到了補充的作用,方便我們后期在編寫類的時候能很好的區(qū)分出這個類是屬于表現(xiàn)層、業(yè)務層還是數(shù)據(jù)層的類

四.純注解開發(fā)模式
顧名思義,純注解的模式就是摒棄以前的配置操作,全部由注解來完成
@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~");
}
}
五.注解實現(xiàn)注入
Set注入的原理是通過set方法在容器內(nèi)部將一個類設置到另一個類中,這也是比較常用的方法。那么在純注解開發(fā)的模式下如何實現(xiàn)注入呢?
@Service
public class A implements AA {
@Autowired
private B b;
}
如上,通過在屬性上添加注解@Autowired就實現(xiàn)了將B注入到A中
1.自動裝配
在前面寫配置文件的階段autowire屬性可以開啟自動裝配,通常使用按類型裝配autowire="byType"
對于自動裝配的理解:在set注入的基礎上配置文件寫的更加簡潔,因為在Service里寫了set方法把Dao的對象搞到了Service里,所以在配置Bean的時候我們通過自動裝配,在xml文件里實現(xiàn)了Service和Dao自動結合,不再需要去Service里通過property標簽來指定相應的name-ref
自動裝配基于反射設計創(chuàng)建對象并通過暴力反射為私有屬性進行設值普通反射只能獲取public修飾的內(nèi)容,暴力反射除了獲取public修飾的內(nèi)容還可以獲取private修改的內(nèi)容,注解的模式就是體現(xiàn)形式的變式,自動裝配本質(zhì)還是沒有變
2.按名稱注入
針對相同類型的Bean如果IOC中存在多個,那按照類型注入一定會出錯,就像這樣

我通過注解注入的方式,注入了兩個AA的實現(xiàn)類到B中,然后通過B來調(diào)用AA接口下的save()方法講道理應該輸出“hello~A”,結果出現(xiàn)了NoUniqueBeanDefinitionException

可見按照類型注入還是存在弊端啊,如何解決?
我們可以通過按照名稱注入的方式:
當根據(jù)類型在容器中找到多個bean,注入?yún)?shù)的屬性名又和容器中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.簡單數(shù)據(jù)注入
通過注解@value可以實現(xiàn)簡單數(shù)據(jù)注入,以String類型數(shù)據(jù)為例
@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:配置文件內(nèi)容——name=lanyangyang
@Repository("a")
public class A implements AA {
@Value("${name}")
private String str;
public void save() {
System.out.println(str);
}
}
運行結果:lanyangyang
其實讀取配置文件連接數(shù)據(jù)庫也是這套操作
六.Spring整合MyBatis
在配置好MyBatis的基礎上(不熟悉的可以去看一下以前寫的MyBatis文章),Spring的整合工作就變的非常簡單,主要工作就是管理MyBatis中的SqlSessionFactory和Mapper接口的掃描
1.首先導入兩個整合需要的的jar包:
<artifactId>spring-jdbc</artifactId>和13<artifactId>mybatis-spring</artifactId>
2.配置數(shù)據(jù)源對象

2.創(chuàng)建主配置類
@Configuration
@ComponentScan("yu7daily")
@PropertySource("classpath:jdbc.properties")
4@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {...}
3.創(chuàng)建MyBatis配置類并獲得SqlSessionFactory對象

4.最后在主函數(shù)中得到對應的Bean即可進行對數(shù)據(jù)層的操作
ApplicationContext ACC = new AnnotationConfigApplicationContext(SpringConfig.class);
AccountService acc = ACC.getBean(AccountService.class);
這工作量比原來是不是簡單多了,簡直太哇塞了
到此這篇關于Spring純注解開發(fā)模式讓開發(fā)簡化更簡化的文章就介紹到這了,更多相關Spring注解開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
解決nacos啟動報錯Server check fail, please che
這篇文章主要介紹了nacos啟動 Server check fail, please check server localhost ,port 9848 is available的錯誤原因以及解決方法,需要的朋友可以參考下2023-09-09
Java操作另一個Java程序使其重啟的簡單實現(xiàn)
下面小編就為大家?guī)硪黄狫ava操作另一個Java程序使其重啟的簡單實現(xiàn)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-03-03
如何在Spring Boot應用程序中配置了兩個不同的SOAP Web服務端點
這篇文章主要介紹了如何在Spring Boot應用程序中配置了兩個不同的SOAP Web服務端點,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
Java中使用Thread類和Runnable接口實現(xiàn)多線程的區(qū)別
這篇文章主要介紹了使用Thread類和Runnable接口實現(xiàn)多線程的區(qū)別,本文給大家介紹了兩種實現(xiàn)方式的步驟,除了以上兩種多線程實現(xiàn)方式,還可以使用 Callable 接口實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-07-07
關于@Controller和@Restcontroller的那點奇葩事
這篇文章主要介紹了關于@Controller和@Restcontroller的那點奇葩事,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02

