目录
一、spring实例化方式
spring实例化的方式有两种:
-
构造方法实例化
1.无参构造
public class UserDaoImpl implements UserDao {
//无参构造
public UserDaoImpl() {
System.out.println("UserDaoImpl无参构造实例化...........");
}
}
<!--配置UserDaoImpl-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl"></bean>
2.有参构造
public class UserDaoImpl implements UserDao {
//有参构造
public UserDaoImpl(String userName, int age) {
System.out.println("UserDaoImpl有参构造实例化...........");
}
}
<!--配置UserDaoImpl-->
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
<constructor-arg name="userName" value="zhangsan"></constructor-arg>
<constructor-arg name="age" value="18" ></constructor-arg>
</bean>
-
工厂方式实例化
1.静态工厂方法实例化
public class jingtaiFactory {
public static UserDao getUserDao(String name){
return new UserDaoImpl();
}
}
<!--静态工厂实例化bean:不需要实例化jingtaiFactory,通过静态工厂的静态方法 getUserDao 获取UserDao对象实例-->
<bean id="userDao2" class="com.itheima.factory.jingtaiFactory" factory-method="getUserDao">
<constructor-arg name="name" value="dsfd"></constructor-arg>
</bean>
注意!!!注意!!!:由上图可以看出静态工厂不需要实例化jingtaiFactory,因为jingtaiFactory是通过静态方法static getUserDao获取UserDao实例的
2.实例工厂方法实例化
public class shiliFactory {
public UserDao getUserDao(String userName,int age){
return new UserDaoImpl();
}
}
<!--实例工厂实例化bean:先实例化shiliFactory,在通过getUserDao 获取UserDao对象实例-->
<bean id="shiliFactory" class="com.itheima.factory.shiliFactory"></bean>
<bean id="userDao1" factory-bean="shiliFactory" factory-method="getUserDao">
<constructor-arg name="userName" value="gdgdsg"></constructor-arg>
<constructor-arg name="age" value="111"></constructor-arg>
</bean>
注意!!!注意!!!:由上图可以看出实例工厂需要实例化shiliFactory,因为shiliFactory获取UserDao实例的方法不是静态的,所以要先获取shiliFactory实例化对象,然后通过shiliFactory实例化对象调用getUserDao方法获取UserDao实例
3.实现factoryBean规范延迟实例化
public class implementsFactoryBean implements FactoryBean<UserDao> {
public UserDao getObject() throws Exception {
return new UserDaoImpl();
}
public Class<?> getObjectType() {
return UserDao.class;
}
}
<!--实现factoryBean规范延迟实例化:先实例化implementsFactoryBean,等调用implementsFactoryBean类的getObject方法时,才会生成userdao对象实例-->
<bean id="userDao3" class="com.itheima.factory.implementsFactoryBean"></bean>
上图中spring容器加载完后生成的是implementsFactoryBean ,并不是UserDao
只有在调用getbean方法时, implementsFactoryBean 实例对象调用getobject方法生成UserDao对象,放到factoryBeanObjectCache中(单例)