1. 程式人生 > >JavaEE Bean裝配方式——基於註解的裝配

JavaEE Bean裝配方式——基於註解的裝配

在Spring中,儘管使用XML配置檔案可以實現Bean的裝配工作,但是如果應用中有很多Bean將會使XML過於臃腫,給後續的維護和升級帶來很大困難,為此Spring提供了對Annotation(註解)技術的全面支援,(註解也是Spring中實現Bean裝配時最經常使用的)

Spring中定義了一系列的註解,常用的註解如下所示

@Component 可以使用此註解描述Spring中的Bean,但他是一個泛化的概念,僅僅表示一個元件(Bean),並且可以作用在任何層次。使用時只需將該註解標註在相應類上即可
@Repository 用於將資料訪問層(DAO層)的類標識為Spring中的Bean,其功能與@Component相同
@Service 通常作用在業務層(Service層),用於將業務層的類表示為Spring中的Bean,其功能與@Component相同
@Controller 通常作用在控制層(Controller層),用於將業務層的類表示為Spring中的Bean,其功能與@Component相同
@Autowired 用於對Bean的屬性變數、屬性的setter方法及構造方法進行標註,配合對應的註解處理器完成對Bean的自動配置工作,預設按照Bean的型別進行裝配
@Resource 其作用與@Autowired一樣
@Qualifier 與@Autowired配合使用

為了更加直觀的感受不同註解的作用,下面我們通過一個案例來演示如何通過註解來裝配Bean

1、在chapter02專案的src目錄下建立一個com.itheima.annotation包,在該包中建立介面UserDao,並在介面中定義一個save方法,如下面程式碼所示:

package com.itheima.annotation;

public interface UserDao {
	public void save();

}

2、在該包中建立介面UserDao的實現類UserDaoImpl,並實現介面的save方法,如下面程式碼所示:

package com.itheima.annotation;
import org.springframework.stereotype.Repository;

@Repository("userDao")
public class UserDaoImpl implements UserDao {

	public void save() {
		System.out.println("userdao,,,,,,save,,,,,,");

	}

}

在上面的程式碼中首次使用了@Repository註解將UserDaoImpl類標識為Spring中的Bean,其寫法相當於在配置檔案中加入

<bean id="userDao" class="com.itheima.annotation.UserDaoImpl" />

然後在save方法中輸出列印的一句話,驗證是否成功呼叫了該方法

3、在com.itheima.annotation包中建立介面UserService,並在介面中定義一個save方法,如下面程式碼所示:

package com.itheima.annotation;

public interface UserService {

	public void save();
}

4、在該包中建立介面UserService的實現類UserServiceImpl,並實現介面的save方法,如下面程式碼所示:

package com.itheima.annotation;

import javax.annotation.Resource;
import org.springframework.stereotype.Service;
@Service("userService")

public class UserServiceImpl implements UserService {

	@Resource(name="userDao")
	private UserDao userDao;
	
	public void save() {
		this.userDao.save();
		System.out.println("userservice,,,,,,,,,,save,,,,,");

	}

}

在上面的程式碼中首先使用@Service註解將UserServiceImpl類標識為Spring中的Bean,這相當於在配置檔案中

<bean id="userServiceI" class="com.itheima.annotation.UserServiceImpl" />,然後使用@Resource註解標註在屬性userDao上,在相當於在配置檔案中加入 <property name="userDao" ref="userDao"/>

5、在com.itheima.annotation包中建立控制器類UserController,編輯後如下面程式碼所示:

package com.itheima.annotation;
import javax.annotation.Resource;
import org.springframework.stereotype.Controller;

@Controller("userController")

public class UserController {
	@Resource(name="userService")
	private UserService userService;
	public void save() {
		this.userService.save();
		System.out.println("userController,,,,,,,,save,,,,,,,");
	}

}

在上面的程式碼中首先使用@Controller註解將UserController類標識為Spring中的Bean,這相當於在配置檔案中

<bean id="userController" class="com.itheima.annotation.UserController" />,然後使用@Resource註解標註在屬性userService上,在相當於在配置檔案中加入 <property name="userService" ref="userService"/>

6、在com.itheima.annotation包中,建立配置檔案beans6.xml,在配置檔案中編寫基於Annotation裝配的程式碼,程式碼如下:

<?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-4.3.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.3.xsd">
        
        <!-- 使用context名稱空間,在配置檔案中開啟相應的註解處理器 -->
        <context:annotation-config/>
        <bean id="userDao" class="com.itheima.annotation.UserDao" />
        <bean id="userService" class="com.itheima.annotation.UserService" />
        <bean id="userController" class="com.itheima.annotation.UserController" />
        
</beans>

首先通過配置<context:annotation-config>來開啟註解處理器,最後分別定義了3個Bean對應編寫的3個例項。與XML裝配方式不同的是,這裡不再需要property

在上述Spring配置檔案中的註解方式雖然大大簡化了XML檔案中的Bean的配置,但是仍需一一將配置對應的Bean配置,為此Spring提供了另一種更加高效的註解配置方式,

<context:component-scan base-backage="Bean所在包的路徑" />

可以將上述beans6.xml中10-14行替換為:

<context:component-scan base-backage="com.itheima.annotation" />

!!!!!另外,使用上述程式碼進行替換時,必須在專案中匯入Spring的AOP的jar包,否則程式會執行出錯

7、在com.itheima.annotation包中,建立測試類AnnotationAssembleTest,在類中編寫測試方法並定義配置檔案的路徑,然後通過Spring容器載入配置檔案並獲取UserController例項,最後呼叫save方法,程式碼如下所示:

package com.itheima.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AnnotationAssembleTest {

	private static ApplicationContext beanlizi;

	public static void main(String[] args) {
		String xmlPath = "com/itheima/annotation/beans6.xml";
		beanlizi = new ClassPathXmlApplicationContext(xmlPath);
		
		UserController userController = (UserController) beanlizi.getBean("userController");
		userController.save();
		
	}

}

執行程式後結果如下圖所示:

從上圖中我們可以看到Spring容器已經成功獲取了UserController例項,並在通過呼叫例項中的方法依次執行了各層的輸出語句,這說明基於Annotation裝配Bean已經成功實現了