bean
通过同一个bean创建的对象默认是同一个
可以通过bean中的属性进行修改
为什么bean默认是单例的?
对于spring来说,管理的bean放在容器中,如果不是单例的,则需要用一个造一个,太庞大了
spring管理的是可以复用的bean:
表现层对象
业务层对象
数据层对象
工具对象
不适合交给容器管理的bean:
封装实体的域对象
bean是如何创建出来的:
bean本质上就是对象,创建bean使用构造方法完成
实例化bean的三种方式:
1.空参构造
2.通过静态工厂
工厂类
package org.example.factory;
import org.example.dao.BookDao;
import org.example.dao.impl.BookDaoImpl;
public class getBookDao {
public static BookDao getBookDao(){
System.out.println("factory setup....");
return new BookDaoImpl();
}
}
配置
<bean id="bookDao" class="org.example.factory.getBookDao" factory-method="getBookDao"/>
3.示例工厂初始化对象
工厂类
package org.example.factory;
import org.example.dao.BookDao;
import org.example.dao.impl.BookDaoImpl;
public class getBookDao {
public BookDao getBookDao(){
System.out.println("factory setup....");
return new BookDaoImpl();
}
}
配置:需要先把工厂类实例化 在调用其对象
<bean id="bookDao" class="org.example.factory.getBookDao"/>
<bean id="bookDao2" factory-method="getBookDao" factory-bean="bookDao"/>
第三种方式的变形-----FactoryBean:
package org.example.factory;
import org.example.dao.BookDao;
import org.example.dao.impl.BookDaoImpl;
import org.springframework.beans.factory.FactoryBean;
public class bookFactoryBean implements FactoryBean<BookDao> {
@Override
public BookDao getObject() throws Exception {
return new BookDaoImpl();
}
@Override
public Class<?> getObjectType() {
return BookDao.class;
}
}
<bean id="bookDao2" class="org.example.factory.bookFactoryBean"/>
Bean的生命周期:
配置:
<bean id="bookDao" class="org.example.dao.impl.BookDaoImpl" init-method="init" destroy-method="destroy"/>
ClassPathXmlApplicationContext ctx= new ClassPathXmlApplicationContext("applicationContext.xml");
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.save();
//ctx.close();//比较暴力 不能放在创建对象前
ctx.registerShutdownHook();//可以放在创建对象前
第一种:
第二种:
bean生命周期的流程: