Spring基於註解的Ioc配置

首先需要建立的認知是:註解配置XML配置要實現的功能 (都是爲了降低程序間的耦合) 都是一樣的,只是形式上的區別。
不管是XML配置還是註解配置都需要Sping的jar包的支持,所以開始之前都需要導入jar包

  <!--Spring開發包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.1.RELEASE</version>
        </dependency>

編寫業務層,以及添加註解

/**
 * 賬戶業務層接口
 */
public interface AccountService {

    /**
     * 保存賬戶
     */
    void saveAccount();
}
/**
 * 賬戶的業務層實現類
 */
@Component(value = "accountService")
public class AccountServiceImpl implements AccountService {

    public void saveAccount() {
        System.out.println("調用了業務層方法......");
    }
}
註解 功能
@Component 把資源讓Spring來管理,相當於在XML中配置一個bean

屬性value:相當於XML配置bean標籤的id屬性,如果不指定value屬性值,默認值爲當前類名,首字母小寫。
@Component註解的三個衍生註解
三個衍生註解和@Component 註解的作用以及屬性是一模一樣的,只是標明所用層

註解 功能
@Controller 相當於在XML中配置一個bean, 一般用於表現層的註解
@Service 相當於在XML中配置一個bean, 一般用於業務層的註解
@Repository 相當於在XML中配置一個bean, 一般用於持久層的註解

那麼我們則可以把上面實例代碼中的@Component替換爲@Service
編寫XML配置並開啓註解支持

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
        <!--Spring創建容器時 需要掃描的包-->
        <context:component-scan base-package="com.liang.service"></context:component-scan>
</beans>

編寫測試方法

    @Test
    public void configTest()
    {

        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        AccountService accountService = (AccountService)applicationContext.getBean("accountService");
        System.out.println(accountService);
        accountService.saveAccount();
    }

業務層測試完畢 接下來測試持久層,以及關聯各層。
編寫持久層,以及添加註解

public interface AccountDao {
    /**
     * 保存賬戶
     */
    void saveAccount();
}
@Repository(value = "accountDao")
public class AccountDaoImpl implements AccountDao {

    public void saveAccount() {
        System.out.println("保存了賬戶");
    }
}

修改業務層,以及添加註解
修改方式一

@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    private AccountDao accountDao;

    public void saveAccount() {
        accountDao.saveAccount();
    }
}
註解 功能
@Autowired 自動按照數據類型注入,但只能注入其他bean類型,當容器中有唯一的bean對象類型和注入的變量類型匹配時,注入成功。如果容器中有多個類型匹配時候,則在類型匹配的基礎上尋找bean的value值和注入的變量名相同的,沒有相同的則報錯。 (使用註解注入屬性時,set方法可以省略)

在這裏插入圖片描述
修改方式二

@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {

    @Autowired
    @Qualifier(value = "accountDao")
    private AccountDao accountDao;

    public void saveAccount() {
        accountDao.saveAccount();
    }
}
註解 功能
@Qualifier 在自動注入的基礎上,在按照bean的id值注入,此註解在注入屬性時,不能獨立使用,必須和@Autowired配合使用

修改方式三

@Service(value = "accountService")
public class AccountServiceImpl implements AccountService {

    @Resource(name = "accountDao")
    private AccountDao accountDao;

    public void saveAccount() {
        accountDao.saveAccount();
    }
}
註解 功能
@Resource 直接按照bean的di值注入,屬性name用於指定bean的id(value)值

修改XML配置

  <!--Spring創建容器時 需要掃描的包-->
        <context:component-scan base-package="com.liang"></context:component-scan>

進行測試

    @Test
    public void configTest()
    {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
        AccountService accountService = (AccountService)applicationContext.getBean("accountService");
        System.out.println(accountService);
        accountService.saveAccount();
    }

以上三種注入屬性的方式,都只能注入其他bean類型,無法注入基本類型、String類型和集合類型數據。
基本類型、String類型注入

註解 功能
@Value 注入基本類型和String類型的數據 屬性value用於指定值

集合類型數據只能XML配置
補充註解

註解 功能
@Scope 指定bean的作用範圍, value屬性取值 singleton、prototype、request、session、globalsession
@PostConstruct 用於指定初始化方法
@PreDestroy 用於指定銷燬方法
發佈了71 篇原創文章 · 獲贊 6 · 訪問量 5384
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章