Spring IOC容器-Bean管理——基于XML(续集)

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>

 

posted @ 2022-10-03 17:29  Jonkidi  阅读(17)  评论(0)    收藏  举报