Spring入門到精通之Bean標簽詳解

Bean標簽基本配置

用於配置對象交由Spring 來創建。 默認情況下它調用的是類中的無參構造函數,如果沒有無參構造函數則不能創建成功。

基本屬性: id:Bean實例在Spring容器中的唯一標識 class:Bean的全限定名稱

Bean標簽范圍配置

scope:指對象的作用范圍,取值如下:

取值范圍 說明
singleton 默認值,單例的
prototype 多例的
request WEB   項目中,Spring   創建一個   Bean   的對象,將對象存入到   request   域中
session WEB   項目中,Spring   創建一個   Bean   的對象,將對象存入到   session   域中
global   session WEB   項目中,應用在   Portlet   環境,如果沒有   Portlet   環境那麼globalSession   相當於   session

1)當scope的取值為singleton時

Bean的實例化個數:1個

Bean的實例化時機:當Spring核心文件被加載時,實例化配置的Bean實例

Bean的生命周期:

對象創建:當應用加載,創建容器時,對象就被創建瞭

對象運行:隻要容器在,對象一直活著

對象銷毀:當應用卸載,銷毀容器時,對象就被銷毀瞭

2)當scope的取值為prototype時

Bean的實例化個數:多個

Bean的實例化時機:當調用getBean()方法時實例化Bean

對象創建:當使用對象時,創建新的對象實例

對象運行:隻要對象在使用中,就一直活著

對象銷毀:當對象長時間不用時,被 Java 的垃圾回收器回收瞭

Bean生命周期配置

init-method:指定類中的初始化方法名稱

destroy-method:指定類中銷毀方法名稱

Bean的依賴註入入門

①創建 UserService,UserService 內部在調用 UserDao的save() 方法

public class UserServiceImpl implements UserService {
	@Override
	public void save() {
         ApplicationContext applicationContext = new 
                 ClassPathXmlApplicationContext("applicationContext.xml");       	           UserDao userDao = (UserDao) applicationContext.getBean("userDao");	
          userDao.save();
 	}
 }

②將 UserServiceImpl 的創建權交給 Spring

<bean id="userService" class="com.zjq.service.impl.UserServiceImpl"/>

③從 Spring 容器中獲得 UserService 進行操作

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();

Bean的依賴註入概念

依賴註入(Dependency Injection):它是 Spring 框架核心 IOC 的具體實現。

在編寫程序時,通過控制反轉,把對象的創建交給瞭 Spring,但是代碼中不可能出現沒有依賴的情況。

IOC 解耦隻是降低他們的依賴關系,但不會消除。例如:業務層仍會調用持久層的方法。

那這種業務層和持久層的依賴關系,在使用 Spring 之後,就讓 Spring 來維護瞭。

簡單的說,就是坐等框架把持久層對象傳入業務層,而不用我們自己去獲取

Bean的依賴註入方式

①構造方法

創建有參構造

public class UserServiceImpl implements UserService {
@Override
public void save() {
ApplicationContext applicationContext = new 
                 ClassPathXmlApplicationContext("applicationContext.xml"); 
    UserDao userDao = (UserDao) applicationContext.getBean("userDao");    
          userDao.save();
    }
 }

配置Spring容器調用有參構造時進行註入

<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl">      		   	
    <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>

②set方法

在UserServiceImpl中添加setUserDao方法

public class UserServiceImpl implements UserService {
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;  
        } 
    @Override    
    public void save() {      
   		 userDao.save();
	}
}

配置Spring容器調用set方法進行註入

<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl">
	<property name="userDao" ref="userDao"/>
</bean>

set方法:P命名空間註入

P命名空間註入本質也是set方法註入,但比起上述的set方法註入更加方便,主要體現在配置文件中,如下:

首先,需要引入P命名空間:

xmlns:p="http://www.springframework.org/schema/p"

其次,需要修改註入方式

<bean id="userService" class="com.zjq.service.impl.UserServiceImpl" p:userDao-
 ref="userDao"/>

Bean的依賴註入的數據類型

上面的操作,都是註入的引用Bean,除瞭對象的引用可以註入,普通數據類型,集合等都可以在容器中進行註入。

註入數據的三種數據類型

  • 普通數據類型
  • 引用數據類型
  • 集合數據類型

其中引用數據類型,此處就不再贅述瞭,之前的操作都是對UserDao對象的引用進行註入的,下面將以set方法註入為例,演示普通數據類型和集合數據類型的註入。

(1)普通數據類型的註入

public class UserDaoImpl implements UserDao {
    private String company;
    private int age;
    public void setCompany(String company) {
        this.company = company;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void save() {
        System.out.println(company+"==="+age);
        System.out.println("UserDao save method running....");   
    }
}
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="company" value="huawei"></property>
    <property name="age" value="15"></property>
</bean>

(2)集合數據類型(List)的註入

public class UserDaoImpl implements UserDao {
	private List<String> strList;
	public void setStrList(List<String> strList) {
		this.strList = strList;
	}
	public void save() {
        System.out.println(strList);
        System.out.println("UserDao save method running....");
	}
}
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="strList">
        <list>
            <value>aaa</value>
            <value>bbb</value>
            <value>ccc</value>
        </list>
    </property>
</bean>

(3)集合數據類型(List)的註入

public class UserDaoImpl implements UserDao {
	private List<User> userList;
	public void setUserList(List<User> userList) {
	this.userList = userList;  
 }
public void save() {
	System.out.println(userList);
	System.out.println("UserDao save method running....");
	}
}
<bean id="u1" class="com.zjq.domain.User"/>
<bean id="u2" class="com.zjq.domain.User"/>
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="userList">
        <list>
            <bean class="com.zjq.domain.User"/>
            <bean class="com.zjq.domain.User"/>
            <ref bean="u1"/>
            <ref bean="u2"/>       
        </list>
    </property>
</bean>

(4)集合數據類型( Map<String,User> )的註入

public class UserDaoImpl implements UserDao {
    private Map<String,User> userMap;
    public void setUserMap(Map<String, User> userMap) {
    this.userMap = userMap;
    }    
public void save() {      
	System.out.println(userMap);
	System.out.println("UserDao save method running....");
	}
}
<bean id="u1" class="com.zjq.domain.User"/>
<bean id="u2" class="com.zjq.domain.User"/>
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="userMap">
        <map>            
            <entry key="user1" value-ref="u1"/>
            <entry key="user2" value-ref="u2"/>
        </map>
    </property>
</bean>

(5)集合數據類型(Properties)的註入

public class UserDaoImpl implements UserDao {
    private Properties properties;
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
	public void save() {
		System.out.println(properties);
		System.out.println("UserDao save method running....");
	}
}
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl">
    <property name="properties">
        <props>
            <prop key="p1">aaa</prop>
            <prop key="p2">bbb</prop> 
            <prop key="p3">ccc</prop>
        </props>
    </property>
</bean>

引入其他配置文件(分模塊開發)

實際開發中,Spring的配置內容非常多,這就導致Spring配置很繁雜且體積很大,所以,可以將部分配置拆解到其他配置文件中,而在Spring主配置文件通過import標簽進行加載

<import resource="applicationContext-xxx.xml"/>

到此這篇關於Spring入門到精通之Bean標簽詳解的文章就介紹到這瞭,更多相關Spring Bean標簽內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: