欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring純注解開發(fā)模式讓開發(fā)簡化更簡化

 更新時間:2022年08月03日 16:37:45   作者:懶羊羊.java  
Spring3.0引入了純注解開發(fā)的模式,框架的誕生是為了簡化開發(fā),那注解開發(fā)就是簡化再簡化。Spring的特性在整合MyBatis方面體現(xiàn)的淋漓盡致哦

一.注解開發(fā)

以前跟老韓學(xué)習(xí)SE時他就說:

注解本質(zhì)是一個繼承了Annotation 的特殊接口,其具體實現(xiàn)類是Java 運行時生成的動態(tài)代理類。

而我們通過反射獲取注解時,返回的是Java 運行時生成的動態(tài)代理對象$Proxy1。通過代理對象調(diào)用自定義注解(接口)的方法,會最終調(diào)用AnnotationInvocationHandler 的invoke 方法。該方法會從memberValues 這個Map 中索引出對應(yīng)的值。而memberValues 的來源是Java 常量池。

二.注解定義Bean

注解開發(fā)前,配置Bean時是在xml里將class分別寫在Bean標(biāo)簽里,然后起id,就像這樣

<bean id="a" class="yu7daily.Dao.Daoimpl.A" />

注解開發(fā)后,配置Bean時首先將xml里的<Bean>標(biāo)簽刪掉,然后在類上添加@Component注解即可

@Component("a")
 public class A implements AA {
    public void save() {
  System.out.println("book dao save ..." ); 
  	}
 }

在xml文件中來寫一個掃描包的注解標(biāo)簽,對象就裝進(jìn)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到底是什么關(guān)系呢?

三.衍生注解

對于@Component還有衍生的三個注解:

@Controller、@Service、@Repository

結(jié)合與MVC的模式分別起到了補(bǔ)充的作用,方便我們后期在編寫類的時候能很好的區(qū)分出這個類是屬于表現(xiàn)層、業(yè)務(wù)層還是數(shù)據(jù)層的類

四.純注解開發(fā)模式

顧名思義,純注解的模式就是摒棄以前的配置操作,全部由注解來完成

@Configuration:類注解,設(shè)置該類為Spring配置類

@ComponentScan:類注解,設(shè)置Spring配置類掃描路徑

1.寫一個配置類,通過注解@Configuration來標(biāo)注該類為配置類、@ComponentScan來配置包掃描

這樣就替換掉了<context:component-scan base-package="yu7daily.Dao"/>

@Configuration
@ComponentScan("yu7daily")
public class Config {...}

然后類就被放進(jìn)了Bean里,通過

ApplicationContext acct = new AnnotationConfigApplicationContext(Config.class);就可以得到Bean

一頓操作下來我們通過一個Java類替換掉了Spring的核心配置文件,完全告別了xml!

配置Bean作用域

我們知道,通過Bean造的對象默認(rèn)都是單例的,如何造出非單例的Bean?

通過@Scope注解即可,屬性值(默認(rèn)singleton(單例),可選值prototype(非單例))

@Component("a")
@Scope("prototype")
public class A implements AA {
    public void save() {
        System.out.println("hello~");
    }
}

五.注解實現(xiàn)注入

Set注入的原理是通過set方法在容器內(nèi)部將一個類設(shè)置到另一個類中,這也是比較常用的方法。那么在純注解開發(fā)的模式下如何實現(xiàn)注入呢?

@Service
public class A implements AA { 
    @Autowired
    private B b;
 }

如上,通過在屬性上添加注解@Autowired就實現(xiàn)了將B注入到A中

1.自動裝配

在前面寫配置文件的階段autowire屬性可以開啟自動裝配,通常使用按類型裝配autowire="byType"

對于自動裝配的理解:在set注入的基礎(chǔ)上配置文件寫的更加簡潔,因為在Service里寫了set方法把Dao的對象搞到了Service里,所以在配置Bean的時候我們通過自動裝配,在xml文件里實現(xiàn)了Service和Dao自動結(jié)合,不再需要去Service里通過property標(biāo)簽來指定相應(yīng)的name-ref

自動裝配基于反射設(shè)計創(chuàng)建對象并通過暴力反射為私有屬性進(jìn)行設(shè)值普通反射只能獲取public修飾的內(nèi)容,暴力反射除了獲取public修飾的內(nèi)容還可以獲取private修改的內(nèi)容,注解的模式就是體現(xiàn)形式的變式,自動裝配本質(zhì)還是沒有變

2.按名稱注入

針對相同類型的Bean如果IOC中存在多個,那按照類型注入一定會出錯,就像這樣

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

可見按照類型注入還是存在弊端啊,如何解決?

我們可以通過按照名稱注入的方式:

當(dāng)根據(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();
    }
}

隨著運行結(jié)果,輸出了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); 
    }
 }

 運行結(jié)果:hello

其實上述操作看起來有點多此一舉,@value主要還是為了讀取配置文件而服務(wù)的

4.讀取properties配置文件

首先在配置類上寫上注解@PropertySource用來指明讀取目錄下的哪個文件

@Configuration
@ComponentScan("yu7daily")
@PropertySource("test.properties")
public class SpringConfig { 
  }

在相應(yīng)的屬性上配置@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); 
    }
 }

 運行結(jié)果:lanyangyang

其實讀取配置文件連接數(shù)據(jù)庫也是這套操作

六.Spring整合MyBatis

在配置好MyBatis的基礎(chǔ)上(不熟悉的可以去看一下以前寫的MyBatis文章),Spring的整合工作就變的非常簡單,主要工作就是管理MyBatis中的SqlSessionFactory和Mapper接口的掃描

1.首先導(dǎo)入兩個整合需要的的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ù)中得到對應(yīng)的Bean即可進(jìn)行對數(shù)據(jù)層的操作

        ApplicationContext ACC = new AnnotationConfigApplicationContext(SpringConfig.class);
        AccountService acc = ACC.getBean(AccountService.class);

這工作量比原來是不是簡單多了,簡直太哇塞了

到此這篇關(guān)于Spring純注解開發(fā)模式讓開發(fā)簡化更簡化的文章就介紹到這了,更多相關(guān)Spring注解開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring Boot高級教程之Spring Boot連接MySql數(shù)據(jù)庫

    Spring Boot高級教程之Spring Boot連接MySql數(shù)據(jù)庫

    這篇文章主要為大家詳細(xì)介紹了Spring Boot高級教程之Spring Boot連接MySql數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • MapTask工作機(jī)制圖文詳解

    MapTask工作機(jī)制圖文詳解

    今天小編就為大家分享一篇關(guān)于MapTask工作機(jī)制圖文詳解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • 使用自定義注解實現(xiàn)redisson分布式鎖

    使用自定義注解實現(xiàn)redisson分布式鎖

    這篇文章主要介紹了使用自定義注解實現(xiàn)redisson分布式鎖,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 深入理解Java中的HashMap

    深入理解Java中的HashMap

    HashMap是Java程序員使用頻率最高的用于映射(鍵值對)處理的數(shù)據(jù)類型。隨著JDK(Java Developmet Kit)版本的更新,JDK1.8對HashMap底層的實現(xiàn)進(jìn)行了優(yōu)化,例如引入紅黑樹的數(shù)據(jù)結(jié)構(gòu)和擴(kuò)容的優(yōu)化等。本文將深入探討HashMap的結(jié)構(gòu)實現(xiàn)和功能原理
    2021-06-06
  • java多種幻燈片切換特效(經(jīng)典)

    java多種幻燈片切換特效(經(jīng)典)

    功能說明: 代碼實現(xiàn)了多種幻燈片變換特效. 如:淡入淡出、緩慢覆蓋、旋轉(zhuǎn)覆蓋等10多種變換效果。
    2013-03-03
  • java多線程編程學(xué)習(xí)(線程間通信)

    java多線程編程學(xué)習(xí)(線程間通信)

    下面小編就為大家?guī)硪黄猨ava多線程編程學(xué)習(xí)(線程間通信)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Leetcode常見鏈表問題及代碼示例

    Leetcode常見鏈表問題及代碼示例

    這篇文章主要介紹了Leetcode常見鏈表問題及代碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • 基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA)

    基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA)

    這篇文章主要介紹了基于XML的MyBatis的環(huán)境搭建過程詳解(IDEA),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • java基于正則表達(dá)式實現(xiàn)時間日期的常用判斷操作實例

    java基于正則表達(dá)式實現(xiàn)時間日期的常用判斷操作實例

    這篇文章主要介紹了java基于正則表達(dá)式實現(xiàn)時間日期的常用判斷操作,簡單說明了正則表達(dá)式常用元字符含義并結(jié)合實例形式分析了java基于正則表達(dá)式針對常用日期時間格式的判斷操作技巧,需要的朋友可以參考下
    2017-10-10
  • spring啟動錯誤Singleton bean creation not allowed while the singletons of this factory are indestruction

    spring啟動錯誤Singleton bean creation not al

    本文主要介紹了spring啟動錯誤Singleton bean creation not allowed while the singletons of this factory are indestruction,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07

最新評論