最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2022年08月03日 16:37:45   作者:懶羊羊.java  
Spring3.0引入了純注解開發(fā)的模式,框架的誕生是為了簡(jiǎn)化開發(fā),那注解開發(fā)就是簡(jiǎn)化再簡(jiǎn)化。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ǔ)上配置文件寫的更加簡(jiǎn)潔,因?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.簡(jiǎn)單數(shù)據(jù)注入

通過注解@value可以實(shí)現(xiàn)簡(jiǎ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的整合工作就變的非常簡(jiǎn)單,主要工作就是管理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);

這工作量比原來是不是簡(jiǎn)單多了,簡(jiǎn)直太哇塞了

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

相關(guān)文章

  • Java?Web項(xiàng)目中解決中文亂碼方法總結(jié)(三種最新方法)

    Java?Web項(xiàng)目中解決中文亂碼方法總結(jié)(三種最新方法)

    這篇文章主要介紹了Java?Web項(xiàng)目中解決中文亂碼方法總結(jié),本文給大家分享三種最新解決方法,需要的朋友可以參考下
    2022-06-06
  • 解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please check server localhost ,port 9848 is available的問題

    解決nacos啟動(dòng)報(bào)錯(cuò)Server check fail, please che

    這篇文章主要介紹了nacos啟動(dòng) Server check fail, please check server localhost ,port 9848 is available的錯(cuò)誤原因以及解決方法,需要的朋友可以參考下
    2023-09-09
  • idea如何指定MainClass

    idea如何指定MainClass

    文章介紹了如何在IntelliJ IDEA中設(shè)置Java后臺(tái)測(cè)試程序的MainClass,并分享了設(shè)置JDK版本和Project language level的方法
    2024-11-11
  • Java操作另一個(gè)Java程序使其重啟的簡(jiǎn)單實(shí)現(xiàn)

    Java操作另一個(gè)Java程序使其重啟的簡(jiǎn)單實(shí)現(xiàn)

    下面小編就為大家?guī)硪黄狫ava操作另一個(gè)Java程序使其重啟的簡(jiǎn)單實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • 如何在Spring Boot應(yīng)用程序中配置了兩個(gè)不同的SOAP Web服務(wù)端點(diǎn)

    如何在Spring Boot應(yīng)用程序中配置了兩個(gè)不同的SOAP Web服務(wù)端點(diǎn)

    這篇文章主要介紹了如何在Spring Boot應(yīng)用程序中配置了兩個(gè)不同的SOAP Web服務(wù)端點(diǎn),本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-08-08
  • java poi導(dǎo)出圖片到excel示例代碼

    java poi導(dǎo)出圖片到excel示例代碼

    這篇文章主要介紹java poi如何導(dǎo)出圖片到excel,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java集成presto查詢方式

    Java集成presto查詢方式

    這篇文章主要介紹了Java集成presto查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中使用Thread類和Runnable接口實(shí)現(xiàn)多線程的區(qū)別

    Java中使用Thread類和Runnable接口實(shí)現(xiàn)多線程的區(qū)別

    這篇文章主要介紹了使用Thread類和Runnable接口實(shí)現(xiàn)多線程的區(qū)別,本文給大家介紹了兩種實(shí)現(xiàn)方式的步驟,除了以上兩種多線程實(shí)現(xiàn)方式,還可以使用 Callable 接口實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07
  • 關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事

    關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事

    這篇文章主要介紹了關(guān)于@Controller和@Restcontroller的那點(diǎn)奇葩事,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java深入理解代碼塊的使用細(xì)節(jié)

    Java深入理解代碼塊的使用細(xì)節(jié)

    所謂代碼塊是指用"{}"括起來的一段代碼,根據(jù)其位置和聲明的不同,可以分為普通代碼塊、構(gòu)造塊、靜態(tài)塊、和同步代碼塊。如果在代碼塊前加上?synchronized關(guān)鍵字,則此代碼塊就成為同步代碼塊
    2022-05-05

最新評(píng)論

黑水县| 永嘉县| 南宁市| 库尔勒市| 灵川县| 东安县| 故城县| 康保县| 库尔勒市| 嵩明县| 巴塘县| 霸州市| 哈巴河县| 商水县| 平安县| 临清市| 永州市| 策勒县| 镇原县| 偏关县| 南靖县| 噶尔县| 闸北区| 高青县| 石屏县| 鄯善县| 华坪县| 治县。| 湘潭市| 孝感市| 浦东新区| 钟祥市| 肥西县| 溆浦县| 奉新县| 资溪县| 七台河市| 隆化县| 汶上县| 砀山县| 贺州市|