Spring IOC容器-Bean管理——基於XML(續集)
1、IOC 操作 Bean 管理(FactoryBean)
1、Spring 有兩種類型 bean,一種普通 bean,另外一種工廠 bean(FactoryBean)
2、普通 bean:在配置文件中定義 bean 類型就是返回類型
3、工廠 bean:在配置文件定義 bean 類型可以和返回類型不一樣 第一步 創建類,讓這個類作爲工廠 bean,實現接口 FactoryBean 第二步 實現接口裏面的方法,在實現的方法中定義返回的 bean 類型
public class MyBean implements FactoryBean<Course> {
//定義返回bean
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("abc");
return course;
}
}
<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean">
</bean>
@Test
public void test3() {
ApplicationContext context =
new ClassPathXmlApplicationContext("bean3.xml");
Course course = context.getBean("myBean", Course.class);//返回值類型可以不是定義的bean類型!
System.out.println(course);
}
2、IOC 操作 Bean 管理(bean 作用域)
在 Spring 裏面,默認情況下,bean 是單實例對象,下面進行作用域設置:
(1)在 spring 配置文件 bean 標籤裏面有屬性(scope)用於設置單實例還是多實例
(2)scope 屬性值 第一個值 默認值,singleton,表示是單實例對象 第二個值 prototype,表示是多實例對象
<bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype"><!--設置爲多實例-->
<property name="list" ref="bookList"></property>
</bean>
(3)singleton 和 prototype 區別
a)singleton 單實例,prototype 多實例
b)設置 scope 值是 singleton 時候,加載 spring 配置文件時候就會創建單實例對象 ;設置 scope 值是 prototype 時候,不是在加載 spring 配置文件時候創建對象,在調用 getBean 方法時候創建多實例對象
3、IOC 操作 Bean 管理(bean 生命週期)
1、生命週期 :從對象創建到對象銷燬的過程
2、bean 生命週期
(1)通過構造器創建 bean 實例(無參數構造)
(2)爲 bean 的屬性設置值和對其他 bean 引用(調用 set 方法)
(3)調用 bean 的初始化的方法(需要進行配置初始化的方法)
(4)bean 可以使用了(對象獲取到了)
(5)當容器關閉時候,調用 bean 的銷燬的方法(需要進行配置銷燬的方法)
3、演示 bean 生命週期 :
public class Orders {
//無參數構造
public Orders() {
System.out.println("第一步 執行無參數構造創建 bean 實例");
}
private String oname;
public void setOname(String oname) {
this.oname = oname;
System.out.println("第二步 調用 set 方法設置屬性值");
}
//創建執行的初始化的方法
public void initMethod() {
System.out.println("第三步 執行初始化的方法");
}
//創建執行的銷燬的方法
public void destroyMethod() {
System.out.println("第五步 執行銷燬的方法");
}
}
public class MyBeanPost implements BeanPostProcessor {//創建後置處理器實現類
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之前執行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之後執行的方法");
return bean;
}
}
<!--配置文件的bean參數配置-->
<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <!--配置初始化方法和銷燬方法-->
<property name="oname" value="手機"></property><!--這裏就是通過set方式(注入屬性)賦值-->
</bean>
<!--配置後置處理器-->
<bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"></bean>
@Test
public void testBean3() {
// ApplicationContext context =
// new ClassPathXmlApplicationContext("bean4.xml");
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("bean4.xml");
Orders orders = context.getBean("orders", Orders.class);
System.out.println("第四步 獲取創建 bean 實例對象");
System.out.println(orders);
//手動讓 bean 實例銷燬
context.close();
}
4、bean 的後置處理器,bean 生命週期有七步 (正常生命週期爲五步,而配置後置處理器後爲七步)
(1)通過構造器創建 bean 實例(無參數構造)
(2)爲 bean 的屬性設置值和對其他 bean 引用(調用 set 方法)
(3)把 bean 實例傳遞 bean 後置處理器的方法 postProcessBeforeInitialization
(4)調用 bean 的初始化的方法(需要進行配置初始化的方法)
(5)把 bean 實例傳遞 bean 後置處理器的方法 postProcessAfterInitialization
(6)bean 可以使用了(對象獲取到了)
(7)當容器關閉時候,調用 bean 的銷燬的方法(需要進行配置銷燬的方法)
4、IOC 操作 Bean 管理(外部屬性文件)
方式一:直接配置數據庫信息 :(1)配置Druid(德魯伊)連接池 (2)引入Druid(德魯伊)連接池依賴 jar 包
<!--直接配置連接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/userDb"></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</bean>
方式二:引入外部屬性文件配置數據庫連接池
(1)創建外部屬性文件,properties 格式文件,寫數據庫信息(jdbc.properties)
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root
(2)把外部 properties 屬性文件引入到 spring 配置文件中 —— 引入 context 名稱空間
<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"><!--引入context名稱空間-->
<!--引入外部屬性文件-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!--配置連接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${prop.driverClass}"></property>
<property name="url" value="${prop.url}"></property>
<property name="username" value="${prop.userName}"></property>
<property name="password" value="${prop.password}"></property>
</bean>
</beans>