Bean的实例化 |
Bean的实例化有三种方式:构造器实例化、静态工厂方式实例化、实例工厂方式实例化。
- 构造器实例化
Spring容器通过Bean对应的默认的构造函数来实例化Bean,在上一篇博客中的两个例子以及如上的xml文件中bean的配置,都是通过构造器的方式来实例化Bean的,因此我们在此不做过多的说明。
- 静态工厂方式实例化
该方式首先要求创建一个静态工厂类,然后在类中定义一个静态方法来创建Bean实例,静态工厂类及静态方法的代码如下:
public class MyUserDaoFactory{ //静态方法,返回UserDaoImpl的实例对象 public static UserDaoImpl createUserDao{ return new UserDaoImpl(); } }
然后是xml配置文件的内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 将指定对象配置给spring,让spring创建其实例 --> <bean id="userDao" class="com.ioc.MyUserDaoFactory" factory-method="createUserDao"/> </beans>
- 实例工厂方式实例化
该种方式的工厂类中,不再使用静态方法创建Bean实例,而是采用直接创建Bean实例的方式。同时在配置文件中,需要实例化的Bean也不是通过class属性直接指向其实例化的类,而是通过factory-bean属性配置一个实例工厂,然后使用factory-method属性确定使用工厂中哪个方法。
工厂类方法代码如下:
public class MyBeanFactory{ public MyBeanFactory(){ System.out.println("this is a bean factory"); } public UserDaoImpl createUserDao(){ return new UserDaoImpl(); } }
xml配置文件如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <!-- 配置工厂 --> <bean id="myBeanFactory" class="com.ioc.MyBeanFactory"/> <!-- 使用factory-bean属性配置一个实例工厂,使用factory-method属性确定工厂中的哪个方法 --> <bean id="userDao" factory-bean="myBeanFactory" factory-method="createUserDao"/> </beans>
好像只有这些代码和xml配置文件无法运行啊,缺少主函数,看看我们的Client主函数,主函数内代码如下:
public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //此处定义xml文件放置的位置为src目录下的com/xml目录下 String path = "com/xml/bean.xml"; ApplicationContext application = new ClassPathXmlApplicationContext(path); UserDaoImpl userDao = (UserDaoImpl) application.getBean("userDao"); userDao.sayHello(); //调用UserDaoImpl类的sayHello方法 }