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已經成功實現了