1、详解1
id不允许重复
默认情况下的反射是通过无参构造方法来创建对象的。
Spring默认情况下也是通过无参构造方法来创建对象的,所以上面的bean的内部必须存在无参构造方法,也就是UserDaoImpl这个类中必须存在无参构造方法。
2、详解2
bean的创建时机 : 打断点,测试bean的创建时机
如果bean的scope是singleton时,它的创建时机就是,当加载配置文件创建Spring容器时,这个bean就创建了。
加载配置文件创建Spring容器就是执行这一行代码:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
如果bean的scope是prototype,它的创建时机是在每次getBean时创建一个对象。
UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
UserDao userDao2 = (UserDao) applicationContext.getBean("userDao");
3、详解3
Bean的生命周期指:bean什么时候创建,什么时候销毁。
两个属性:初始化方法、销毁方法
com.lyh.dao.impl包下的UserDaoImpl 这个类中有 init()方法和destroy()方法
在bean中配置自己定义的初始化方法 和 销毁方法
<bean id="userDao" class="com.lyh.dao.impl.UserDaoImpl" init-method="init" destroy-method="destroy"/>
@Test //初始化方法 和 销毁方法的 测试
public void test2(){
//这个是一个单元测试,没有在一个TomCat服务器内部
//只要这个单元测试执行完毕,那么该销毁的都给销毁了
//这里没有出现销毁的方法 是 因为 还没有来得及打印
//如果想测试出打印 只需要让容器 手动的关闭就是可以了
//但是这个ApplicationContext接口,没有对应的关闭的方法
//所以只能用 ClassPathXmlApplicationContext 这个实现类中的关闭的方法
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 这里就是当前xml配置文件的名称
UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
System.out.println(userDao1);
}
@Test //初始化方法 和 销毁方法的 测试
public void test3(){
ClassPathXmlApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
// 这里就是当前xml配置文件的名称
UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
System.out.println(userDao1);
applicationContext.close();
}
test3的效果:
4、详解4(bean实例化的三种方式)
1、工厂静态方法实例化:
UserDaoImpl类:
package com.lyh.dao.impl;
import com.lyh.dao.UserDao;
public class UserDaoImpl implements UserDao{
public UserDaoImpl(){
System.out.println("UserDaoImpl创建。。。。")
}
}
package com.lyh.factory;
import com.lyh.dao.UserDao;
import com.lyh.dao.impl.UserDaoImpl;
public class StaticFactory {
//对象的工厂创建完毕
public static UserDao getUserDao(){
//返回的是创建一个对象
return new UserDaoImpl();
}
}
applicationContext.xml配置文件中的内容
<bean id="userDao" class="com.lyh.factory.StaticFactory" factory-method="getUserDao"/>
测试代码:工厂静态方法实例化
@Test //工厂静态方法实例化
public void test4(){
// 这里就是当前xml配置文件的名称
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
System.out.println(userDao1);
}
执行效果:
2、工厂实例方法实例化
package com.lyh.factory;
import com.lyh.dao.UserDao;
import com.lyh.dao.impl.UserDaoImpl;
public class DynamicFactory {
//这里就必须得有 工厂对象,再去调用方法
public UserDao getUserDao(){
return new UserDaoImpl();
}
}
<!--先把这个工厂对象让Spring容器产生 再调用 这个工厂内部的 某个方法 -->
<bean id="factory" class="com.lyh.factory.DynamicFactory"/>
<!--要获得userDao这个对象,我要找factory工厂的 getUserDao 方法-->
<bean id="userDao" factory-bean="factory" factory-method="getUserDao"/>
测试方法:
@Test //工厂实例方法实例化
public void test4(){
//这里就是当前xml配置文件的名称
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
System.out.println(userDao1);
}
效果: