Spring學習之路(3)——IoC註解配置

前言

 上一篇的依賴注入是在配置文件中進行手工注入,今天再來學習一下基於註解的裝配。

註解方式

在java代碼中通過@Autowired或@Resource註解方式進行配置,但我們需要在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" 
         xmlns:aop="http://www.springframework.org/schema/aop"
         xmlns:tx="http://www.springframework.org/schema/tx"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
</beans> 

@Autowired

  • 使用註解方式對bean進行裝配,通過匹配數據類型進行裝配,該註解可以在類的成員變量,方法或者構造函數上進行註解,常用於對類的成員變量進行註解。
    • 按照類型來裝配bean
    • 消除了java中的getter/setter方法
    • 消除xml配置文件中對於bean的屬性的配置
    • 如果容器找不到註解的bean實例,會拋出異常,可以使用@Qualifier("name")來指定裝配bean的name,如果容器中沒有name相符的bean,則按照id匹配。

@Resource註解

用法:@Resource(name="xxx",type=xxx.class)

  • 按照名稱裝配
  • 如果同時指定了name和type屬性,則會從容器中尋找name和type相匹配的唯一的bean進行裝配,如果找不到,則拋出異常。
  • 如果只指定name,則尋找name相匹配的,如果沒有,則按照id值尋找,找到匹配的bean進行裝配。
  • 如果只指定了type,則按類型進行裝配,如果找到一個則進行裝配,如果沒找到或找到多個,則拋出異常。
  • 如果即沒有指定name也沒有指定type,則默認按照nam匹配,如果name都不匹配,則按照類型來裝配。

實例

UserDao

package cn.sdut.dao;

public class UserDao {

	public void saveUser() {
		System.out.println("User is saved");
	}
}

UserService

package cn.sdut.service;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;

import cn.sdut.dao.UserDao;

public class UserService {

	@Autowired //從容器中裝配userDao
	private UserDao userDao;
	
	public void print() {
		userDao.saveUser();
	}
}

Test

package cn.sdut.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.sdut.service.UserService;

public class Test {
	
	
	public static void main(String[] args) {
		ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

		UserService userService = (UserService) context.getBean("userService");
		userService.print();
		
	}
}

運行結果

沒有報空指針,裝配成功,@Resource註解效果一樣。

雖然不需要我們配置屬性了,但還是需要我們在xml中配置bean,依然很繁瑣,因此引出了包的自動掃描

包的自動掃描

beans.xml中將配置的bean刪除,加入包的自動掃描

<!-- 支持註解配置 -->
 <context:annotation-config></context:annotation-config>
<!--包的自動掃描-->
<context:component-scan base-package="cn.sdut"></context:component-scan>

base-package就是你要掃描的包下,也就是cn.sdut開頭的所有包。

需要配合下面幾個註解使用

  • @Repository //dao層註解
  • @Service  //邏輯層註解
  • @Controller //控制層註解
  • @Component //其他註解,不屬於以上各層或不好區分時,使用此註解

還是上次的實例

UserDao

package cn.sdut.dao;

import org.springframework.stereotype.Repository;

@Repository
public class UserDao {

	public void saveUser() {
		System.out.println("User is saved");
	}
}

UserService

package cn.sdut.service;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import cn.sdut.dao.UserDao;

@Service
public class UserService {

	@Autowired //從容器中裝配userDao
	private UserDao userDao;
	
	public void print() {
		userDao.saveUser();
	}
}

運行結果不變。

總結:從手工配置bean,配置bean的屬性->到使用註解、自動掃包,果然懶惰纔是第一生產力啊,古人誠不欺我。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章