简单对象的单例、多例模式
单例:Service、DAO、SqlSessionFactory(或者是所有的工厂)
多例:Connection、SqlSession、ShoppongCart
scope="singleton" 默认的 描述当前对象是单例 拿对象多少次都那同一个对象 scope="prototype" 表示多例 每次调用工厂,都会创建新的对象。 scope="request" 表示每个请求只创建一个对象实例 scope="session" 表示每个session创建一个对象实例 scope="globalSession" 表示portlet 里面的session
FacroryBean创建复杂对象
isSingleton方法:表示是否单例
public class ConnectionFactoryBean implements FactoryBean<Connection> {
private Connection connection =null;
public Connection getObject() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection("jdbc:mysql:///crm", "root", "123456");
return connection;
}
public Class<?> getObjectType() {
return null;
}
public boolean isSingleton() {
return false;
}
}
上图就是spring工厂创建复杂对象,通过实现FacroryBean接口创建复杂对象。
一般来说,创建对象时<bean class=""/>所产生的的类型
但是特例
如果要获取ConnectionFactroyBean对象,在conn前加&
Spring工厂的特性
饿汉式创建优势
工厂创建后,会将Spring配置文件中的所有对象都创建完成(饿汉式)
提高程序运行效率。避免多次IO,减少对象创建时间。(概念接近连接池,一次性创建好,使用时直接获取)
生命周期方法
自定义初始化方法:添加“init-method”属性,Spring则会在创建对象之后,调用此方法。
自定义销毁方法:添加“destroy-method”属性,Spring则会在销毁对象之前,调用此方法。
销毁:工厂的close()方法被调用之后,Spring会毁掉所有已创建的单例对象。
分类:Singleton对象由Spring容器销毁、Prototype对象由JVM销毁。
多例 prototype 示例:
public class User {
private Integer id;
private String name;
private Integer age;
private String gender;
public User(){
System.out.println("构造方法执行了");
}
public User(Integer id, String name, Integer age, String gender) {
this.id = id;
this.name = name;
this.age = age;
this.gender = gender;
}
public void init (){
System.out.println("对象初始化了");
}
public void destroy(){
System.out.println("对象销毁了");
}
}
多例不会执行销毁方法
单例singleton示例