Spring學習(二)
Bean標籤常用屬性
(1)id屬性:起的名稱,id屬性值名稱可以任意命名,id屬性值不能包含特殊符號,根據id值,得到配置物件
(2)class屬性:建立物件所在類的全路徑
(3)name屬性:功能和id屬性一樣,id屬性值不能包含特殊符號,但是在name屬性值裡面可以包含特殊符號。
(4)scope屬性:
-singleton:預設值,單例的,
bean1.xml配置如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- ioc入門 --> <bean id="user" class="cn.itcast.ioc.User" scope="singleton"></bean> <!-- 使用靜態工廠建立物件 --> <!-- <bean id="bean2" class="cn.itcast.bean.Bean2Factory" factory-method="getBean2"></bean> --> <!-- 使用例項工廠建立物件 --> <!-- 建立工廠物件 --> <!-- <bean id="bean3Factory" class="cn.itcast.bean.Bean3Factory"></bean> <bean id="bean3" class="bean3Factory" factory-method="getBean3"></bean> --> </beans>
-prototype:多例的
TestIOC類程式碼不變,將配置檔案的bean標籤的scope值改為prototype,結果如下
-request:建立物件把物件放到request域裡面
-session:建立物件把物件放到session域裡面
-globalSession:建立物件把物件放到globalSession裡面
屬性注入
1 建立物件時候,向類裡面屬性裡面設定值
2 屬性注入的方式介紹(三種方式)
(1)使用set方法注入
(2)使用有引數構造注入
(3)使用介面注入
3 在spring框架裡面,支援前兩種方式
(1)set方法注入
(2)有引數構造注入
使用有參建構函式注入
bean1.xml <!-- 使用有引數構造注入屬性 --> <bean id="demo1" class="cn.itcast.property.PropertyDemo1"> <!-- 使用有參建構函式注入屬性 --> <constructor-arg name="username" value="小王"></constructor-arg> </bean>
PropertyDemo1.java
package cn.itcast.property;
public class PropertyDemo1 {
private String username;
public PropertyDemo1(String username) {
this.username = username;
}
public void test1() {
System.out.println("demo1>>>>>>>"+username);
}
}
package cn.itcast.ioc; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import cn.itcast.bean.Bean2; import cn.itcast.property.PropertyDemo1; public class TestIOC { @Test public void testUser() { //1載入spring配置檔案,根據建立物件 ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml"); //2得到配置建立的物件 PropertyDemo1 demo1=(PropertyDemo1) context.getBean("demo1"); demo1.test1(); } }
使用set方法注入屬性
book.java
package cn.itcast.property;
public class Book {
private String bookname;
//set方法
public void setBookname(String bookname) {
this.bookname = bookname;
}
public void demobook() {
System.out.println("book......"+bookname);
}
}
bean1.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- ioc入門 -->
<!-- <bean id="user" class="cn.itcast.ioc.User" scope="prototype"></bean> -->
<!-- 使用靜態工廠建立物件 -->
<!-- <bean id="bean2" class="cn.itcast.bean.Bean2Factory" factory-method="getBean2"></bean> -->
<!-- 使用例項工廠建立物件 -->
<!-- 建立工廠物件 -->
<!-- <bean id="bean3Factory" class="cn.itcast.bean.Bean3Factory"></bean>
<bean id="bean3" class="bean3Factory" factory-method="getBean3"></bean> -->
<!-- 使用有引數構造注入屬性 -->
<!-- <bean id="demo1" class="cn.itcast.property.PropertyDemo1"> -->
<!-- 使用有參建構函式注入屬性 -->
<!-- <constructor-arg name="username" value="小王"></constructor-arg>
</bean> -->
<!-- 使用set方法注入屬性 -->
<bean id="book" class="cn.itcast.property.Book">
<!-- 注入屬性 -->
<property name="bookname" value="PHP開發實戰"></property>
</bean>
</beans>
package cn.itcast.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.itcast.bean.Bean2;
import cn.itcast.property.Book;
import cn.itcast.property.PropertyDemo1;
public class TestIOC {
@Test
public void testUser() {
//1載入spring配置檔案,根據建立物件
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
//2得到配置建立的物件
Book book=(Book) context.getBean("book");
book.demobook();
}
}
注入物件型別屬性(重點)
1 建立service類和到類
(1)在service得到dao物件
2 具體實現過程
(1)在service裡面把dao作為型別屬性
(2)生成dao型別屬性 的set方法
package cn.itcast.ioc;
public class UserService {
//1定義dao型別屬性
private UserDao userDao;
//2生成set方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void add() {
System.out.println("service......");
//在service裡面得到dao類物件,才能呼叫dao
/* UserDao dao=new UserDao();
dao.add();*/
userDao.add();
}
}
(3)配置檔案中完成注入。
P*名稱空間注入
package cn.itcast.property;
public class Person {
private String pname;
public void setPname(String pname) {
this.pname = pname;
}
public void test1() {
System.out.println("person....."+pname);
}
}
注入複雜型別屬性
1 陣列型別
2 list集合
3 map集合
4 properties型別
package cn.itcast.property;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class Person {
private String pname;
public void setPname(String pname) {
this.pname = pname;
}
private String[] arrs;
private List<String>list;
private Map<String,String>map;
private Properties properties;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void test1() {
System.out.println("person....."+pname);
System.out.println("arrs....."+arrs);
System.out.println("map....."+map);
System.out.println("properties....."+properties);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 注入複雜型別屬性值 -->
<bean id="person" class="cn.itcast.property.Person">
<property name="pname" value="錘子"></property>
<!-- 陣列 -->
<property name="arrs">
<list>
<value>小王</value>
<value>小馬</value>
<value>小宋</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>小奧</value>
<value>小金</value>
<value>小徐</value>
</list>
</property>
<!-- map -->
<property name="map">
<map>
<entry key="aa" value="lucy"></entry>
<entry key="Bb" value="mary"></entry>
<entry key="cc" value="jack"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
</beans>
package cn.itcast.ioc;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.itcast.bean.Bean2;
import cn.itcast.property.Book;
import cn.itcast.property.Person;
import cn.itcast.property.PropertyDemo1;
public class TestIOC {
@Test
public void testUser() {
//1載入spring配置檔案,根據建立物件
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
//2得到配置建立的物件
Person person=(Person) context.getBean("person");
person.test1();
}
}
IOC和DI區別
(1)IOC:控制反轉,把物件建立交給spring進行配置
(2)DI:依賴注入,向類裡面的屬性中設定值
(3)關係:依賴注入不能單獨存在,需要在ioc基礎之上完成操作
Spring 整合web專案原理
1 載入spring核心配置檔案
//1載入spring配置檔案,根據建立物件
ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");
(1)new物件,功能可以實現,效率很低
2 實現思想:把載入配置檔案和建立物件過程,在伺服器啟動時候完成
3 實現原理
(1)ServletContext物件
(2)監聽器
(3)具體使用
-在伺服器啟動時候,為每個專案建立ServletContext物件
-在ServletContext物件建立時候,使用監聽器可以具體到ServletContext物件在什麼時候建立
-使用監聽器監聽到ServletContext物件建立時候
-載入spring配置檔案,把配置檔案配置物件建立
-把創建出來的物件放到ServletContext域物件裡面(setAttribute方法 )
-獲取物件時候,到ServletContext域得到(getAttribute方法)