說說個人spring入門3--ioc經常使用註解

今天我會在spring入門1的基礎上,對1中的bean.xml進行改進,採用註解配置,實現與1中一樣的功能。java

經常使用註解

曾經XML的配置:spring

  • <bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"
  • scope="" init-method="" destroy-method="">
  • <property name="" value="" | ref=""></property>
  • </bean>

用於建立對象的api

  • 他們的做用就和在XML配置文件中編寫一個<bean>標籤實現的功能是同樣的
  • Component:
  • 做用:用於把當前類對象存入spring容器中
  • 屬性:
  • value:用於指定bean的id。當咱們不寫時,它的默認值是當前類名,且首字母改小寫。
  • Controller:通常用在表現層
  • Service:通常用在業務層
  • Repository:通常用在持久層
  • 以上三個註解他們的做用和屬性與Component是如出一轍。
  • 他們三個是spring框架爲咱們提供明確的三層使用的註解,使咱們的三層對象更加清晰

*
*
用於注入數據的框架

  • 他們的做用就和在xml配置文件中的bean標籤中寫一個<property>標籤的做用是同樣的
  • Autowired:
  • 做用:自動按照類型注入。只要容器中有惟一的一個bean對象類型和要注入的變量類型匹配,就能夠注入成功
  • 若是ioc容器中沒有任何bean的類型和要注入的變量類型匹配,則報錯。
  • 若是Ioc容器中有多個類型匹配時:
  • 出現位置:
  • 能夠是變量上,也能夠是方法上
  • 細節:
  • 在使用註解注入時,set方法就不是必須的了。
  • Qualifier:
  • 做用:在按照類中注入的基礎之上再按照名稱注入。它在給類成員注入時不能單獨使用。可是在給方法參數注入時能夠(稍後咱們講)
  • 屬性:
  • value:用於指定注入bean的id。
  • Resource
  • 做用:直接按照bean的id注入。它能夠獨立使用
  • 屬性:
  • name:用於指定bean的id。
  • 以上三個注入都只能注入其餘bean類型的數據,而基本類型和String類型沒法使用上述註解實現。
  • 另外,集合類型的注入只能經過XML來實現。

*測試

  • Value
  • 做用:用於注入基本類型和String類型的數據
  • 屬性:
  • value:用於指定數據的值。它可使用spring中SpEL(也就是spring的el表達式)
  • SpEL的寫法:${表達式}

*
用於改變做用範圍的prototype

  • 他們的做用就和在bean標籤中使用scope屬性實現的功能是同樣的
  • Scope
  • 做用:用於指定bean的做用範圍
  • 屬性:
  • value:指定範圍的取值。經常使用取值:singleton prototype

*
和生命週期相關 (瞭解)指針

  • 他們的做用就和在bean標籤中使用init-method和destroy-methode的做用是同樣的
  • PreDestroy
  • 做用:用於指定銷燬方法
  • PostConstruct
  • 做用:用於指定初始化方法

*/code

項目工程

配置bean.xml
爲了使用註解配置,必定要改變版本信息,以下文件頭所示(能夠在spring幫助文檔中,點擊core,ctrl+f查找xmlns:cont,複製看到的版本信息到bean.xml便可)。component

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--告知spring在建立容器時要掃描的包,配置所須要的標籤不是在bean.xml的約
    束中,而是一個名稱爲context名稱空間和約束中-->
    <context:component-scan base-package="com.itheima"></context:component-scan>
</beans>

將類加入容器
咱們在要添加到spring容器的類前面加@Component註解,便可將其加入容器。可是你覺得這樣就好了嗎?想多了。spring怎麼知道哪一個類被註解了呢 ?以咱們須要告訴spring到哪裏掃描註解。在bean.xml的</context:component-scan>標籤中配置base-package屬性便可,咱們選擇com.itheima,就會掃描這個包下全部類上的註解。xml

@Component
public class AccountServiceImpl implements IAccountService {

    private IAccountDao accountDao;

    public void  saveAccount(){
        accountDao.saveAccount();

    }
}

固然也能夠爲上述註解設置一個Id

@Component(value = "AccountService")
public class AccountServiceImpl implements IAccountService {
    private IAccountDao accountDao;

    public void  saveAccount(){
        accountDao.saveAccount();

    }
}

持久層註解

@Repository("accountDao")
public class AccountDaoImpl implements IAccountDao {
    public  void saveAccount(){
        System.out.println("保存了帳戶");
    }
}

對其測試(這裏同時用了第二種獲取容器對象的方法)

IAccountDao addo = ac.getBean("accountDao",IAccountDao.class);
        System.out.println(addo);

注入數據
上述代碼調用咱們調用as.saveAccount()方法會報空指針異常,這是由於as中的private IAccountDao accountDao沒有注入對象。解決方式以下

*Autowired註解
使用了該註解後,須要注入對象的類會在容器中尋找相同類型的類,找到一個就直接把它注入。找到多個,按名字相同的注入,不然報錯

@Component(value = "AccountService")
public class AccountServiceImpl implements IAccountService {
    @Autowired
    
    private IAccountDao accountDao;
    public void  saveAccount(){
        accountDao.saveAccount();
    }
}
@Repository("accountDao2")
public class AccountDaoImpl2 implements IAccountDao {
    public  void saveAccount(){
        System.out.println("保存了帳戶222");
    }
}

多個Bean類型的解決方式
1 Autowired配合Qualifier使用

@Component(value = "AccountService")
public class AccountServiceImpl implements IAccountService {
    @Autowired
    @Qualifier(value = "accountDao1")
    private IAccountDao accountDao;
    public void  saveAccount(){
        accountDao.saveAccount();
    }
}

2 Resource註解

@Service(value = "AccountService")
public class AccountServiceImpl implements IAccountService {
    @Resource(name="accountDao1")
    private IAccountDao accountDao;
    public void  saveAccount(){
        accountDao.saveAccount();
    }
}

不過使用該註解須要導包(導包時可能發生不知名錯誤,但就是這個包,重導幾回就行)

<dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
相關文章
相關標籤/搜索