Bean實例化的方式
在spring里面通過配置文件創(chuàng)建對象
-
bean實例化三種方式實現(xiàn)
- 使用類的無參數(shù)構造創(chuàng)建(重點/主要使用)
<bean id="user" class="com.ljy.spring.User"></bean>
如果類里面沒有無參構造則會出錯
- 使用靜態(tài)工廠創(chuàng)建
創(chuàng)建一個靜態(tài)方法,返回類對象
<!--使用靜態(tài)工廠創(chuàng)建對象 --> <bean id="bean2" class="com.ljy.spring2.Bean2Factory" factory-method="getBean2"></bean>
- 使用實例工廠創(chuàng)建
創(chuàng)建不是靜態(tài)的方法谦纱,返回類對象
<!--實例工廠創(chuàng)建對象 --> <!--創(chuàng)建工廠對象 --> <bean id = "bean3Factory" class="com.ljy.bean.Bean3Factory"></bean> <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
bean標簽常用屬性
- id屬性
給bean起名字,id屬性值名稱不能包含特殊符號亲轨,根據(jù)id得到配置對象 - class屬性
創(chuàng)建對象所在的類的全路徑 - name屬性
跟id屬性一樣脊髓,但是id屬性值不能包含特殊符號 但是name屬性值里面可以包含特殊符號,不過目前都用id - scope屬性
屬性值有- singleton:默認值,單例的 對象只能創(chuàng)建一次
- prototype: 多例的 每次創(chuàng)建都是一個新的對象
- request:創(chuàng)建對象把對象放在request域里面
- session:創(chuàng)建對象吧對象放在session里
- globalSession:創(chuàng)建對象把對象放在globalSession里面全局Session 單點登錄
屬性注入
- 創(chuàng)建對象時候 向類的屬性設置值
- 屬性注入的方式(三種)
- set注入
image - 有參數(shù)構造注入
image - 接口注入 不常用
image
- set注入
- spring中只支持前兩種方式
1.使用有參構造函數(shù)注入(不常用)applicationContex.xml: <!-- 使用有參數(shù)構造注入屬性 --> <bean id="demo" class="com.ljy.property.PropertyDemo1"> <!-- 使用有參構造 --> <constructor-arg name="username" value="xiaohong"></constructor-arg> </bean>
public class PropertyDemo1 { private String username; public PropertyDemo1(String username) { super(); this.username = username; } public void test1(){ System.out.println("demo1++++"+username); }
}
2.使用set注入
public class Book {
private String bookname;
public String getBookname() {
return bookname;
}
public void setBookname(String bookname) {
this.bookname = bookname;
}
public void demobook(){
System.out.println("book:"+bookname);
}
}
<bean id="book" class="com.ljy.property.Book">
<!-- 屬性注入 name屬性名稱 value屬性值 -->
<property name="bookname" value="西游記"></property>
</bean>
注入對象類型屬性
-
創(chuàng)建 service類和dao類
- 在service得到dao對象:
-
具體實現(xiàn)過程
- 在Service里面擦dao作為類型屬性
- 生成dao類型的屬性的set方法
public class UserService { //定義一個dao類型屬性 private UserDao userDao; //生成set方法 public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
<!-- 注入 對象類型屬性--> <bean id="userDao" class="com.ljy.ioc.UserDao"></bean> <bean id="userService" class="com.ljy.ioc.UserService"> <!-- 注入dao對象 現(xiàn)在不用value屬性 因為不是字符串 而是對象 而要換做ref屬性:dao配置bean標簽中id值 --> <property name="userDao" ref="userDao"></property> <!-- 這里創(chuàng)建了userDao的對象 并注入給userService的UserDao類型的屬性 --> </bean>
P名稱空間注入
public class Person {
private String pname;
public void setPname(String pname) {
this.pname = pname;
}
public void test1(){
System.out.println("person..."+pname);
}
}
<!-- p名稱空間注入 -->
<bean id="person" class="com.ljy.property.Person" p:pname="lucy"></bean>
注入復雜類型
- 數(shù)組
- list集合
- map集合
- properties類型
<bean id="person" class="com.ljy.property.Person">
<!-- arrs -->
<property name="arrs">
<list>
<value>lily</value>
<value>lucy</value>
<value>jack</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="小李"></entry>
<entry key="bb" value="小張"></entry>
<entry key="cc" value="小王"></entry>
</map>
</property>
<!-- properties -->
<property name="properties">
<props>
<prop key="driverclass">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
</bean>
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class Person {
private String pname;
private String[] arrs;
private List<String> list;
private Map<String,String> map;
private Properties properties;
public void setPname(String pname) {
this.pname = pname;
}
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..."+Arrays.toString(arrs));
System.out.println("list..."+list);
System.out.println("map..."+map);
System.out.println("Properties..."+properties);
}
}
輸出結果:
image
IOC和DI的區(qū)別
IOC:控制反轉押赊,把對象創(chuàng)建交給spring進行配置
DI: 依賴注入, 向類里面的屬性注入值
關系:依賴注入不能單獨存在,需要在ioc基礎之上完成操作
Spring整合web項目
- 加載spring核心配置文件
//加載spring配置文件,根據(jù)創(chuàng)建對象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContex.xml");
- new對象包斑,功能可以實現(xiàn)流礁,效率很低
- 實現(xiàn)思想:把家在配置文件和創(chuàng)建對象的過程,在服務器啟動時候完成
- 實現(xiàn)原理
- ServletContext對象
- 監(jiān)聽器
- 具體使用:
- 在服務器啟動時候罗丰,為每個項目創(chuàng)建一個ServletContext對象
- 在ServletContext對象創(chuàng)建的時候神帅,使用監(jiān)聽器可以具體到ServletContext對象在什么時候創(chuàng)建
- 使用監(jiān)聽器監(jiān)聽到ServletContext對象創(chuàng)建時候,
- 加載spring配置文件萌抵,把配置文件配置對象創(chuàng)建
- 把創(chuàng)建對象放到ServletContext域對象里面(setAttribute方法)
- 獲取對象時候,到ServletContext域得到(getAttribute()方法)