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>
屬性注入(用什麼方式給成員變量賦值)
- 通過構造器注入
- set方法注入(重點)
- 使用接口注入
<!-- 使用有參構造器注入屬性值 -->
<!-- 使用有參構造器注入屬性值 -->
<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>
注入對象類型屬性
步驟:
- 在service中把dao作爲一個類型屬性
- 生成dao類型屬性的set方法
- 在配置文件中注入關係
<!-- 注入對象類型的屬性 -->
<!-- 配置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)ServletContext對象
2)監聽器 - 具體應用:
1)在服務器啓動的時候爲web項目創建一個ServletContext對象
2)在ServletContext對象創建的時候,可以通過監聽器監聽到該對象的創建
3)使用監聽器在該對象的創建的時候加載spring配置文件,就可以創建配置文件指定的對象
4)可以使用ServletContext對象的getAttribute()和setAttribute()設置和獲取對象
註解的方式管理bean
步驟
- 開啓註解掃描 掃描指定包中帶註解的類
- 需要在對應的類上面使用註解
- 測試
<?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”) 多例 |
說明
- 前四個註解在創建對象的時候功能是一致的,都可以創建對象。
- 使用@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...");
}
}
使用註解的方式注入屬性
- @Autowired:自動注入屬性
- @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();
}
}
配置文件和註解的混合使用方式
- 創建對象使用配置文件方式實現
- 注入屬性使用註釋的方式實現