Spring對Bean的管理

bean標籤的常用屬性
屬性 含義
id 爲Bean起名字,唯一,起名遵循變量規範
class 類的全類名,通過反射創建實例
name 爲Bean起名字,可以出現特殊字符;沒有id,name可以當成id使用
scope 屬性來指定bean的範圍

scope的取值及含義

取值 含義
singleton 單例(默認的)
prototype 多例
request 創建的對象存入到 request 域中
session 創建的對象存入到 session 域中.
<bean id="user" class="com.hpe.ioc.User" scope="prototype"></bean>
屬性注入(用什麼方式給成員變量賦值)
  1. 通過構造器注入
  2. set方法注入(重點)
  3. 使用接口注入
<!-- 使用有參構造器注入屬性值 -->
<!-- 使用有參構造器注入屬性值 -->
<bean id="user2" class="com.hpe.ioc.User">
	<!-- name:指的是有參構造器的參數,value:指的是屬性值 -->
	<constructor-arg name="username" value="tom"></constructor-arg>
	<constructor-arg name="age" value="20"></constructor-arg>
	<constructor-arg name="sex" value=""></constructor-arg>
</bean>
<!-- 使用set注入 -->
<bean id="person" class="com.hpe.ioc.Person">
	<!-- name:類中定義的屬性名稱,value:設置具體的值 -->
	<property name="name" value="zhangsan"></property>
	<property name="age" value="20"></property>
</bean>
注入對象類型屬性

步驟:

  1. 在service中把dao作爲一個類型屬性
  2. 生成dao類型屬性的set方法
  3. 在配置文件中注入關係
<!-- 注入對象類型的屬性 -->
<!-- 配置service的dao對象 -->
<bean id="userDao" class="com.hpe.dao.UserDao"></bean>
<bean id="userService" class="com.hpe.service.UserService">
	<!-- 注入UserDao對象,不能使用value屬性,使用關聯對象ref屬性 
		 name的值:UserService是屬性名稱
		 ref:引入另一個bean的id或者name
	 -->
	<property name="userDao" ref="userDao"></property>
</bean>
注入複雜類型的屬性
<!-- 注入複雜類型的屬性 -->
<bean id="person2" class="com.hpe.ioc.Person">
	<property name="array">
		<array>
			<value>sing</value>
			<value>football</value>
		</array>
	</property>
	<property name="list">
		<list>
			<value>A</value>
			<value>B</value>
			<value>C</value>
		</list>
	</property>
	<property name="set">
		<set>
			<value>c語言</value>
			<value>Java</value>
			<value>c++</value>
		</set>
	</property>
	<property name="map">
		<map>
			<entry key="name" value="tom"></entry>
			<entry key="tel" value="10086"></entry>
		</map>
	</property>
	
	<!-- Properties -->
	<property name="properties">
		<props>
			<prop key="username">root</prop>
			<prop key="password">1234</prop>
		</props>
	</property>
</bean>
Spring整合web項目的原理
  1. 存在問題:每次操作數據庫都需要加載配置文件,性能低
  2. 解決方案:把加載配置文件和創建對象的過程在服務器啓動的時候就完成
  3. 具體實現方式:
    1)ServletContext對象
    2)監聽器
  4. 具體應用:
    1)在服務器啓動的時候爲web項目創建一個ServletContext對象
    2)在ServletContext對象創建的時候,可以通過監聽器監聽到該對象的創建
    3)使用監聽器在該對象的創建的時候加載spring配置文件,就可以創建配置文件指定的對象
    4)可以使用ServletContext對象的getAttribute()和setAttribute()設置和獲取對象

註解的方式管理bean

步驟
  1. 開啓註解掃描 掃描指定包中帶註解的類
  2. 需要在對應的類上面使用註解
  3. 測試
<?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.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
	<!-- 開啓註解掃描
		 base-package:自動掃描指定包的類、方法、屬性上的註解
	 -->
	<context:component-scan base-package="com.hpe"></context:component-scan>
</beans>
常用的註解
註解 含義
@Component 是spring管理組件的通用方式,可以放在類的上面,不推薦使用
@Controller 控制器,表示Web層組件
@Service 業務類,表示業務層組件
@Repository 表示持久層組件
@Scope 指定對象的創建方式是單例還是多例。eg:@Scope(value=“singleton”) 單例;@Scope(value=“prototype”) 多例

說明

  1. 前四個註解在創建對象的時候功能是一致的,都可以創建對象。
  2. 使用@Component、@Controller、@Service是爲了讓標註註解的類本身用途更清晰
// 在類上面使用註解
// 相當於配置方式中<bean id="user",class="com.hpe.po.User"></bean>
@Component(value="user")
//@Scope(value="prototype")
public class User {
	public void add(){
		System.out.println("add...");
	}
}
使用註解的方式注入屬性
  1. @Autowired:自動注入屬性
  2. @Resource:必須指定name,name屬性的值是Dao註解指定的value值
    代碼舉例:
    UserDao.java
@Repository("userDao")
public class UserDao {
	public void add(){
		System.out.println("dao...");
	}
}

UserService.java

// 下面默認帶value@Component(value="userService")
// 下面默認爲@Component(value="userService")
// @Service註解可以不指定value值,通過getBean(類名.class)來獲得
// value的默認值就是類名的首字母小寫
@Service
public class UserService {
	// 得到dao對象
	// 1.定義dao類型屬性,在屬性上面使用註解完成對象屬性注入
	// 如果使用註解,就不需要set方法
	/*@Autowired
	private UserDao userDao;*/
	
	/*public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}*/
	
	// 2.使用@Resource,必須指定name
	// name屬性值等於使用註解創建對象的value值
	// 相當於<property name="userDao" ref="userDao"></property>
	@Resource(name="userDao")
	private UserDao userDao;
	
	public void add(){
		System.out.println("service...");
		userDao.add();
	}
}

SpringTest.java

public class SpringTest {
	// 註解創建對象
	@Test
	public void test1(){
		// 加載配置文件
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		User user = (User) context.getBean("user");
		System.out.println(user);
		user.add();
	}
}
配置文件和註解的混合使用方式
  1. 創建對象使用配置文件方式實現
  2. 注入屬性使用註釋的方式實現
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章