Spring框架學習(第四講)

一、自動裝配

在spring中支持自動裝配Beans,而且支持5中裝配方式。
User.java

package test.com.entity

public classs User {
private Info info ;
public User(Info info){
    this.info = info;
}
public void setInfo(){
    this.info = info ;
}
}

Info.java

package test.com.entity;
public class Info {
private String name;
private int age;

//......get/set方法省略。
}

我們先來看一下在默認的情況下我們通過 ‘ref’ 屬性來連接 bean。

<bean id="user" class="com.test.entity.User">
<property name="info" ref="info" />
</bean>
<bean id="info" class="com.test.entity.Info" />

接下來我們來看一下其他的幾種方式:
Auto-Wiring ‘byName’
按屬性名稱自動裝配。在這種情況下,由於對“info” bean的名稱是相同於“user” bean 的屬性(“info”)名稱,所以,Spring會自動通過setter方法將其裝配 – “setInfo(Info info)“.

<bean id="user" class="com.test.entity.User" autowire="byName" />
<bean id="person" class="com.test.entity.Person" />

Auto-Wiring ‘byType’
通過按屬性的數據類型自動裝配Bean。在這種情況下,由於“Info” bean中的數據類型是與“user” bean的屬性(Info對象)的數據類型一樣的,所以,Spring會自動通過setter方法將其自動裝配。– “setInfo(Info info)“.

<bean id="user" class="com.test.entity.User" autowire="byType" />
<bean id="person" class="com.test.entity.Person" />

Auto-Wiring ‘constructor’
通過構造函數參數的數據類型按屬性自動裝配Bean。在這種情況下,由於“info” bean的數據類型與“user” bean的屬性(Info對象)的構造函數參數的數據類型是一樣的,所以,Spring通過構造方法自動裝配 – “public User(Info info)“.

<bean id="user" class="com.test.entity.User" autowire="constructor" />
<bean id="info" class="com.test.entity.Info" />

二、自動掃描組件以及註解

現在,啓用Spring組件掃描功能。
使用@Component註釋來表示這是類是一個自動掃描組件。
將這個“context:component”在bean配置文件,這意味着,在 Spring 中啓用自動掃描功能。base-package 是指明存儲組件,Spring將掃描該文件夾,並找出Bean(註解爲@Component)並註冊到 Spring 容器。

<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-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
<context:component-scan base-package="com.test.service" />
</beans>

在Spring2.5中,有4種類型的組件自動掃描註釋類型
@Component – 指示自動掃描組件。
@Repository – 表示在持久層DAO組件。
@Service – 表示在業務層服務組件。
@Controller – 表示在表示層控制器組件。
1,使用註解,需要在配置文件中增加命名空間和約束文件

<beans ...  
xmlns:context="http://www.springframework.org/schema/context"  
xsi:schemaLocation="  
....  
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd  
">  

2,告訴框架那些類是使用註解的。

<context:component-scan base-package="com.test.service" />

3,持久層註解

package com.test.dao;

@Repository
public class UserDao{
//……
}

@Rpository 等同於配置文件中的

<bean id="userDao" class="com.test.UserDao" /> 

4,服務層註解

@Service(value="testService")  
public UserService {  

@Resource//相當於自動裝配  
private UserDao userDao ;  

public UserDao getUserDao() {  
             returnuserDao;  
}  
public void setUserDao(UserDao userDao) {  
             this.userDao= userDao;  
}     
}  

@Resource 對象間關係的組合,默認採用的是byName方式進行裝配,如果根據名稱查找不到關聯的對象,那麼會再採用byType繼續查找。

@Service註解等同與

<bean id="testService" class="com.test.service.UserService" />  

5,控制層註解

@Controller(value="ua")  
@Scope(value="prototype")  
public class UserAction {  

     @Resource  
     private UserService userService ;  

     public UserService getUserService() {  
          return userService;  
     }  
}  

@Controller註解等同於

<bean id="ua" class="com.lsz.spring.UserAction " />  

這三個層中的註解關鍵字都可以使用@Component來代替。
使用註解聲明對象,默認情況下生成的id名稱爲類名稱的首字母小寫。

6,從Spring環境中獲取Action對象

ServletContext application =request.getSession().getServletContext();  
ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(application);  
UserAction useraction = (UserAction)ac.getBean("ua");//獲取控制層對象  

response.setContentType("text/html;charset=GBK");//設置編碼  
PrintWriter out =response.getWriter();  

//分別將三個層的對象打印出來。  
out.println("Action:"+userAction);  
out.println("Service:"+userAction.getUserService());  out.println("Dao:"+userAction.getUserService().getUserDao()); 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章