spring工厂和bean生命周期

spring工厂创建对象

创建简单对象
可以直接通过new构造方法创建对象,比如UserDao、UserService
创建复杂对象
值得是不通过直接的new的方式创建对象。比如Connection、SqlSessionFactory。

spring创建复杂对象

  • 实现FactoryBean接口,重写其中的三个方法
public class MyFactory implements FactoryBean {
//用于书写创建复杂对象的方法,并返回
    @Override
    public Object getObject() throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zwq", "root", "409409zwq");

        return connection;
    }
//返回创建对象的类型
    @Override
    public Class<?> getObjectType() {
        return Connection.class;
    }
//返回true只创建一个对象
//返回false每次获取对象都新创建一个
    @Override
    public boolean isSingleton() {
        return false;
    }
}

配置xml文件

<bean id="conn" class="com.zwq.factorybean.MyFactory"></bean>

注意每次获取的对象波昂不是MyFactoy对象,而是Connetion对象

@Test
    public void test1(){
        ApplicationContext cxt = new ClassPathXmlApplicationContext("ApplicationContext.xml");
        Connection conn = (Connection) cxt.getBean("conn");
        System.out.println(conn);
    }

结果:
在这里插入图片描述

如果想要获取MyFactory对象应该书写
cxt.getBean("&conn")

在进获取Connection对象时,我们可以把填写的参数写到配置文件中,做到解耦合。方便修改

  1. 再MyFactory类中定义四个成员变量driverClassName、url、username、password,并提供getter、setter方法
  2. 将四个成员变量写到相应的位置中。
  3. 再xml中进行属性配置的方法赋值。
 	private String driveClassName;
    private String url;
    private String username;
    private String password;
	@Override
 	public Object getObject() throws Exception {
        Class.forName(driveClassName);
        Connection connection = DriverManager.getConnection(url, username, password);
        return connection;
    }

springFactory实现原理

  1. 首先会根据配置文件找到id=“conn”的全部配置信息
  2. 再利用instanceof(FactoryBean)判断类是否是其实现类。
  3. 如果是就根据实现的getObject()方法返回Connection方法
  4. 如果不是就直接new对象返回。

实例工厂创建复杂对象

public class ConnFactory {
    public Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/zwq","root","409409zwq");
        return connection;
    }
}
<bean id="connFactory" class="com.zwq.factorybean.ConnFactory"></bean>
    
    <bean id="conn" factory-bean="connFactory" factory-method="getConnection"></bean>

静态工厂创建复杂对象

public class StaticConnFactory {
    public static Connection getConnection() throws ClassNotFoundException, SQLException {
        Class.forName("com.mysql.jdbc.Driver");
        Connection connection = DriverManager.getConnection("jdbc:mysql://localhost/zwq", "root", "409409zwq");
        return connection;
    }
}
    <bean id="conn" class="com.zwq.factorybean.StaticConnFactory" factory-method="getConnection"/>

spring中bean对象的生命周期

在这里插入图片描述

  1. 对象的是实例化
  2. 对象的属性赋值
  3. 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
  4. 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
  5. 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
  6. 如果实现了BeanPostProcessor方法,重写了postProcessBeforeInitialization,执行方法对bean进行加工
  7. 对象的初始化

spring工厂再创建完对象后,条用对象的初始化方法,完成对应的初始化操作。
InitializingBean接口

实现afterProperitesSet方法,根据需求再里面写代码

配置bean,写普通方法
为对象提供普通方法,再bean中init-method=“方法名”
  1. 如果实现了BeanPostProcessor方法,重写了postProcessBeforeInitialization,执行方法对bean进行加工
  2. 对象的销毁,当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法,如果再bean配置中有destro-method就会执行指定的方法。

注意:如果spring的ioc容器为spring工厂管理,去掉第五步即可。

BeanFactory和FactoryBean

BeanFactory:是一个接口,从名字可以看出,它就是一个对象工厂类,所有的bean都是交由beanFactroy进行管理的。
FactoryBean:是一个接口,用来创建复杂对象的,实现其中的三个方法可以配置bean对象。请看文章开头.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值