Spring知識小計1
1. Bean標籤
取值範圍 | 說明 |
---|---|
singleton | 這是預設值,單例 |
prototype | 多例 |
request | WEB 專案中,Spring 建立一個 Bean 的物件,將物件存入到 request 域中 |
session | WEB 專案中,Spring 建立一個 Bean 的物件,將物件存入到 session 域中 |
gloable session | WEB 專案中,應用在 Portlet 環境,如果沒有 Portlet 環境那麼globalSession 相當於 session |
1.1 當scope的取值是singleton的時候
-
Bean的例項化個數:1
-
Bean的例項化時機:當Spring的核心檔案被載入的時候
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
-
Bean的生命週期:
- 建立:應用進行載入,容器建立的時候,物件被建立
- 執行:只要容器還在,物件就一直存在
- 銷燬:應用解除安裝,容器銷燬的餓時候,物件就被銷燬了
1.2 當scope的取值是prototype的時候
-
Bean的例項化個數:多個,每次進行呼叫getBean的時候,都會例項化新的物件
-
Bean的例項化時機:呼叫getBean的時候
Object userService = applicationContext.getBean("userService");
-
Bean的生命週期
- 物件建立:當使用物件時,建立新的物件例項
- 物件執行:只要物件在使用中,就一直活著
- 物件銷燬:當物件長時間不用時,被 Java 的垃圾回收器回收了
2. 如何進行Bean的例項化
有三種方式:無參構造方法例項化,工廠靜態方法例項化,工廠例項方法例項化
2.1 無參構造方法
<bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/>
這樣就可以利用UserDao userDao = (UserDao)applicationContext.getBean(“userDao”);
2.2 工廠靜態方法
既然是工廠方法,肯定要先構造一個工廠放到spring容器中
public class StaticFactoryBean {
public static UserDao createUserDao(){
return new UserDaoImpl();
}
}
<bean id="userDao" class="xqp.factory.StaticFactoryBean"
factory-method="createUserDao" />
其中factory-method是用來指向具體的方法的,這裡因為是靜態的,因此通過getBean()方法後會或的對應的class的屬性,進而得到對應的類(不是類的物件),最後在根據factory-method方法來表明這個類應該呼叫那個方法來返回所需要的物件
2.3 工廠例項方法
public class DynamicFactoryBean {
public UserDao createUserDao(){
return new UserDaoImpl();
}
}
<bean id="factoryBean" class="xqp.factory.DynamicFactoryBean"/>
<bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>
3. Bean的依賴注入
依賴注入式Spring框架核心IOC的具體實現。在編寫程式的時候,由於IOC的存在,物件的建立權被交給了Spring,但是程式碼中不可能出現沒有依賴的情況,IOC的存在也只是降低了耦合而不是消滅了耦合。
3.1 依賴注入的兩種方式
-
構造方法注入(引用型別資料的注入為例)
<bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/> <bean id="userService" class="xqp.service.impl.UserServiceImpl"> <constructor-arg name="userDao" ref="userDao"></constructor-arg> </bean>
-
set方法注入,引用型別資料的注入為例,如果是用的是xml方式的話set方法不能省略,但是如果使用的是註解方式,那麼set方法可以省略)
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void save() { userDao.save(); } }
<bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/> <bean id="userService" class="xqp.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="xqp.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
-
-
3.2 依賴注入的資料型別
-
普通資料型別
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; } @Override public void save() { System.out.println(company+"==="+age); System.out.println("UserDao save method running...."); } }
<bean id="userDao" class="xqp.dao.impl.UserDaoImpl"> <property name="company" value="大疆"></property> <property name="age" value="15"></property> </bean>
-
引用資料型別
public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void save() { userDao.save(); } }
<bean id="userDao" class="xqp.dao.impl.UserDaoImpl"/> <bean id="userService" class="xqp.service.impl.UserServiceImpl"> <property name="userDao" ref="userDao"/> </bean>
-
集合資料型別
-
List<普通資料型別>
public class UserDaoImpl implements UserDao { private List<String> strList; public void setStrList(List<String> strList) { this.strList = strList; } @Override public void save() { System.out.println(strList); System.out.println("UserDao save method running...."); } }
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"> <property name="strList"> <list> <value>aaa</value> <value>bbb</value> <value>ccc</value> </list> </property> </bean>
-
List<引用資料型別>
public class UserDaoImpl implements UserDao { private List<User> userList; public void setUserList(List<User> userList) { this.userList = userList; } @Override public void save() { System.out.println(userList); System.out.println("UserDao save method running...."); } }
<bean id="userDao" class="xqp.dao.impl.UserDaoImpl"> <property name="userList"> <list> <!--進行引用型別的注入--> <bean class="xqp.domain.User" ref="user1"/> <bean class="xqp.domain.User" ref="user2"/> </list> </property> </bean> <bean id="user1" class="xqp.domain.User"> <!--User裡面也有屬性,因此也需要一塊進行注入--> <property name="name" value="Tom"></property> <property name="addr" value="beijing"></property> </bean> <bean id="user2" class="xqp.domain.User"> <!--User裡面也有屬性,因此也需要一塊進行注入--> <property name="name" value="Lucy"></property> <property name="addr" value="tianjing"></property> </bean>
-
Map
<bean id="user1" class="xqp.domain.User"> <!--User裡面也有屬性,因此也需要一塊進行注入--> <property name="name" value="Tom"></property> <property name="addr" value="beijing"></property> </bean> <bean id="user2" class="xqp.domain.User"> <!--User裡面也有屬性,因此也需要一塊進行注入--> <property name="name" value="Lucy"></property> <property name="addr" value="tianjing"></property> </bean> <property name="userMap"> <map> <!--這個key代表的map的key,叫啥都行,無所謂--> <!--ref指向的是要注入的Bean,是要引用容器當中的Bean的id--> <entry key="aaaa" value-ref="user1"></entry> <entry key="bbbb" value-ref="user2"></entry> </map> </property>
-
Properties
public class UserDaoImpl implements UserDao { private Properties properties; public void setProperties(Properties properties) { this.properties = properties; } @Override public void save() { System.out.println(properties); System.out.println("UserDao save method running...."); } }
<bean id="userDao" class="xqp.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>
-