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对象时,我们可以把填写的参数写到配置文件中,做到解耦合。方便修改
- 再MyFactory类中定义四个成员变量driverClassName、url、username、password,并提供getter、setter方法
- 将四个成员变量写到相应的位置中。
- 再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实现原理
- 首先会根据配置文件找到id=“conn”的全部配置信息
- 再利用instanceof(FactoryBean)判断类是否是其实现类。
- 如果是就根据实现的getObject()方法返回Connection方法
- 如果不是就直接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对象的生命周期
- 对象的是实例化
- 对象的属性赋值
- 如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是Spring配置文件中Bean的ID
- 如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(),传递的是Spring工厂本身(可以用这个方法获取到其他Bean)
- 如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文,该方式同样可以实现步骤4,但比4更好,以为ApplicationContext是BeanFactory的子接口,有更多的实现方法
- 如果实现了BeanPostProcessor方法,重写了postProcessBeforeInitialization,执行方法对bean进行加工
- 对象的初始化
spring工厂再创建完对象后,条用对象的初始化方法,完成对应的初始化操作。
InitializingBean接口
实现afterProperitesSet方法,根据需求再里面写代码
配置bean,写普通方法
为对象提供普通方法,再bean中init-method=“方法名”
- 如果实现了BeanPostProcessor方法,重写了postProcessBeforeInitialization,执行方法对bean进行加工
- 对象的销毁,当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean接口,会调用其实现的destroy方法,如果再bean配置中有destro-method就会执行指定的方法。
注意:如果spring的ioc容器为spring工厂管理,去掉第五步即可。
BeanFactory和FactoryBean
BeanFactory:是一个接口,从名字可以看出,它就是一个对象工厂类,所有的bean都是交由beanFactroy进行管理的。
FactoryBean:是一个接口,用来创建复杂对象的,实现其中的三个方法可以配置bean对象。请看文章开头.