跳转至

Spring Bean 后置处理器

1. 介绍

  在之前的案例中,所有bean对象的创建都是通过反射得到对应的bean实例,其实在spring中还包含另外一种创建bean实例的方式,就是通过工厂模式进行对象的创建,在利用工厂模式创建bean实例的时候有两种方式,分别是静态工厂和实例工厂。

  • 静态工厂:工厂本身不需要创建对象,但是可以通过静态方法调用,对象=工厂类.静态工厂方法名()
  • 实例工厂:工厂本身需要创建对象,工厂类 工厂对象=new 工厂类;工厂对象.get对象名()

2. 示例

ioc4.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"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--<bean id="person" class="com.cmz.bean.Person" scope="prototype">-->
    <!--根据属性值设置的时候,name的名字取决于set方法后面的参数首字母小写的名称-->
    <!--
    name: 表示参数列表的名称
    value: 表示实际的具体指
    type: 表示值的类型
    index: 表示值的下标,从0开始
    -->

    <!--利用工厂方法创建bean-->
    <!--静态工厂  类名.静态方法()-->
    <bean id="person" class="com.cmz.factory.PersonStaticFactory" factory-method="getInstance">
        <constructor-arg value="张三"></constructor-arg>
    </bean>

    <!--实例工厂 先创建工厂实例,然后在调研工厂实例的方法-->
    <!--
    factory-bean  表示具体工厂类的实例
    factory-method 表示具体工厂实例的方法
    -->
    <bean id="instanceFactory" class="com.cmz.factory.PersonInstanceFactory"></bean>
    <bean id="person2" class="com.cmz.bean.Person"  factory-bean="instanceFactory" factory-method="getInstance">
        <constructor-arg value="李四"></constructor-arg>
    </bean>
</beans>

MyTest4.class

import com.cmz.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author summer
 * @create 2020-02-22 23:45
 */
public class MyTest4 {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("ioc4.xml");
        Person person = context.getBean("person", Person.class);
        System.out.println(person);

        ApplicationContext context2 = new ClassPathXmlApplicationContext("ioc4.xml");
        Person person2 = context.getBean("person2", Person.class);
        System.out.println(person2);
    }
}

输出

Person{id=1, name='张三', age=11, gender='null', date=null}
Person{id=2, name='李四', age=22, gender='null', date=null}