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

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

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

一.注解開發(fā)

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

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

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

二.注解定義Bean

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

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

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

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

在xml文件中來寫一個(gè)掃描包的注解標(biāo)簽,對(duì)象就裝進(jìn)IOC容器里了

<context:component-scan base-package="yu7daily.Dao"/>

component-scan:component意為組件,scan意為掃描

包路徑越多,掃描的范圍越小速度越快·包路徑越少,掃描的范圍越大速度越慢

最后直接從容器獲取對(duì)象

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        A aa = (A) ctx.getBean("a");
        bookService.save();
    }

這里要注意的是:由于接口無法創(chuàng)建對(duì)象,所以別把注解寫在接口上?。?/p>

注解真是神奇啊,他和原先的xml里的Bean到底是什么關(guān)系呢?

三.衍生注解

對(duì)于@Component還有衍生的三個(gè)注解:

@Controller、@Service、@Repository

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

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

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

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

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

1.寫一個(gè)配置類,通過注解@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

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

配置Bean作用域

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

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

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

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

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

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

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

1.自動(dòng)裝配

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

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

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

2.按名稱注入

針對(duì)相同類型的Bean如果IOC中存在多個(gè),那按照類型注入一定會(huì)出錯(cuò),就像這樣

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

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

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

當(dāng)根據(jù)類型在容器中找到多個(gè)bean,注入?yún)?shù)的屬性名又和容器中bean的名稱不一致,這個(gè)時(shí)候該如何解決,就需要使用到注解@Qualifier 來指定注入哪個(gè)名稱的bean對(duì)象,在不修改其他條件下,就像這樣

@Repository("b")
public class B implements BB {
    @Autowired
    @Qualifier("a") //注入指定的對(duì)象名稱
    private AA aa;
    public void save() {
        aa.save();
    }
}

隨著運(yùn)行結(jié)果,輸出了A的成員方法,說明注入成功!

值得注意的是:@Qualifier不能獨(dú)立使用,必須和@Autowired一起使用?。?!

3.簡單數(shù)據(jù)注入

通過注解@value可以實(shí)現(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); 
    }
 }

 運(yùn)行結(jié)果:hello

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

4.讀取properties配置文件

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

@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); 
    }
 }

 運(yùn)行結(jié)果:lanyangyang

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

六.Spring整合MyBatis

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

1.首先導(dǎo)入兩個(gè)整合需要的的jar包:

<artifactId>spring-jdbc</artifactId>13<artifactId>mybatis-spring</artifactId>

2.配置數(shù)據(jù)源對(duì)象

2.創(chuàng)建主配置類

@Configuration
@ComponentScan("yu7daily")
@PropertySource("classpath:jdbc.properties")
4@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {...}

3.創(chuàng)建MyBatis配置類并獲得SqlSessionFactory對(duì)象

4.最后在主函數(shù)中得到對(duì)應(yīng)的Bean即可進(jìn)行對(duì)數(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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

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

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

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

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

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

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

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

    深入理解Java中的HashMap

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

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

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

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

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

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

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

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

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

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

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

    spring啟動(dòng)錯(cuò)誤Singleton bean creation not al

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

最新評(píng)論