一、自動裝配
在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());