首頁 > 軟體

Spring純註解開發模式讓開發簡化更簡化

2022-08-03 22:02:13

一.註解開發

以前跟老韓學習SE時他就說:

註解本質是一個繼承了Annotation 的特殊介面,其具體實現類是Java 執行時生成的動態代理類。

而我們通過反射獲取註解時,返回的是Java 執行時生成的動態代理物件$Proxy1。通過代理物件呼叫自定義註解(介面)的方法,會最終呼叫AnnotationInvocationHandler 的invoke 方法。該方法會從memberValues 這個Map 中索引出對應的值。而memberValues 的來源是Java 常數池。

二.註解定義Bean

註解開發前,設定Bean時是在xml裡將class分別寫在Bean標籤裡,然後起id,就像這樣

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

註解開發後,設定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();
    }

這裡要注意的是:由於介面無法建立物件,所以別把註解寫在介面上!!

註解真是神奇啊,他和原先的xml裡的Bean到底是什麼關係呢?

三.衍生註解

對於@Component還有衍生的三個註解:

@Controller、@Service、@Repository

結合與MVC的模式分別起到了補充的作用,方便我們後期在編寫類的時候能很好的區分出這個類是屬於表現層、業務層還是資料層的類

四.純註解開發模式

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

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

五.註解實現注入

Set注入的原理是通過set方法在容器內部將一個類設定到另一個類中,這也是比較常用的方法。那麼在純註解開發的模式下如何實現注入呢?

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

如上,通過在屬性上新增註解@Autowired就實現了將B注入到A中

1.自動裝配

在前面寫組態檔的階段autowire屬性可以開啟自動裝配,通常使用按型別裝配autowire="byType"

對於自動裝配的理解:在set注入的基礎上組態檔寫的更加簡潔,因為在Service裡寫了set方法把Dao的物件搞到了Service裡,所以在設定Bean的時候我們通過自動裝配,在xml檔案裡實現了Service和Dao自動結合,不再需要去Service裡通過property標籤來指定相應的name-ref

自動裝配基於反射設計建立物件並通過暴力反射為私有屬性進行設值普通反射只能獲取public修飾的內容,暴力反射除了獲取public修飾的內容還可以獲取private修改的內容,註解的模式就是體現形式的變式,自動裝配本質還是沒有變

2.按名稱注入

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

我通過註解注入的方式,注入了兩個AA的實現類到B中,然後通過B來呼叫AA介面下的save()方法講道理應該輸出“hello~A”,結果出現了NoUniqueBeanDefinitionException

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

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

當根據型別在容器中找到多個bean,注入引數的屬性名又和容器中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.簡單資料注入

通過註解@value可以實現簡單資料注入,以String型別資料為例

  @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:組態檔內容——name=lanyangyang

  @Repository("a")
  public class A implements AA {
  @Value("${name}")
 private String str;
  public void save() {
System.out.println(str); 
    }
 }

 執行結果:lanyangyang

其實讀取組態檔連線資料庫也是這套操作

六.Spring整合MyBatis

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

1.首先匯入兩個整合需要的的jar包:

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

2.設定資料來源物件

2.建立主設定類

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

3.建立MyBatis設定類並獲得SqlSessionFactory物件

4.最後在主函數中得到對應的Bean即可進行對資料層的操作

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

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

到此這篇關於Spring純註解開發模式讓開發簡化更簡化的文章就介紹到這了,更多相關Spring註解開發內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com