溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時(shí)間:2022-08-04 09:32:24 來(lái)源:億速云 閱讀:139 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Spring純注解開發(fā)模式讓開發(fā)簡(jiǎn)化更簡(jiǎn)化的方法的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇Spring純注解開發(fā)模式讓開發(fā)簡(jiǎn)化更簡(jiǎn)化的方法文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

    一.注解開發(fā)

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

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

    而我們通過(guò)反射獲取注解時(shí),返回的是Java 運(yùn)行時(shí)生成的動(dòng)態(tài)代理對(duì)象$Proxy1。通過(guò)代理對(duì)象調(diào)用自定義注解(接口)的方法,會(huì)最終調(diào)用AnnotationInvocationHandler 的invoke 方法。該方法會(huì)從memberValues 這個(gè)Map 中索引出對(duì)應(yīng)的值。而memberValues 的來(lái)源是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文件中來(lái)寫一個(gè)掃描包的注解標(biāo)簽,對(duì)象就裝進(jìn)IOC容器里了

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

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

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

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

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

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

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

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

    三.衍生注解

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

    @Controller、@Service、@Repository

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

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

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

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

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

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

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

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

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

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

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

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

    配置Bean作用域

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

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

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

    如上,通過(guò)在屬性上添加注解@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í)候我們通過(guò)自動(dòng)裝配,在xml文件里實(shí)現(xiàn)了Service和Dao自動(dòng)結(jié)合,不再需要去Service里通過(guò)property標(biāo)簽來(lái)指定相應(yīng)的name-ref

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

    2.按名稱注入

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

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

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

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

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

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

    當(dāng)根據(jù)類型在容器中找到多個(gè)bean,注入?yún)?shù)的屬性名又和容器中bean的名稱不一致,這個(gè)時(shí)候該如何解決,就需要使用到注解@Qualifier 來(lái)指定注入哪個(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的成員方法,說(shuō)明注入成功!

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

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

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

    通過(guò)注解@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í)上述操作看起來(lái)有點(diǎn)多此一舉,@value主要還是為了讀取配置文件而服務(wù)的

    4.讀取properties配置文件

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

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

    在相應(yīng)的屬性上配置@Value注解即可完成配置文件屬性的讀取

    PS:配置文件內(nèi)容&mdash;&mdash;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ù)庫(kù)也是這套操作

    六.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ì)象

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

    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ì)象

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

    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ā)簡(jiǎn)化更簡(jiǎn)化的方法”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“Spring純注解開發(fā)模式讓開發(fā)簡(jiǎn)化更簡(jiǎn)化的方法”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI