方式一:构造方法实例化 bean
-
准备需要被创建的类
准备一个 BookDao 和 BookDaoImpl 类
public interface BookDao { public void save(); } public class BookDaoImpl implements BookDao { public void save() { System.out.println("book dao save ..."); } }
-
将类配置到 Spring 容器
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/> </beans>
-
编写运行程序
public class AppForInstanceBook { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); BookDao bookDao = (BookDao) ctx.getBean("bookDao"); bookDao.save(); } }
方式二:静态工厂实例化
-
准备一个 OrderDao 和 OrderDaoImpl 类
public interface OrderDao { public void save(); } public class OrderDaoImpl implements OrderDao { public void save() { System.out.println("order dao save ..."); } }
-
创建一个工厂类 OrderDaoFactory 并提供一个静态方法
//静态工厂创建对象 public class OrderDaoFactory { public static OrderDao getOrderDao(){ return new OrderDaoImpl(); } }
-
编写 AppForInstanceOrder 运行类,在类中通过工厂获取对象
public class AppForInstanceOrder { public static void main(String[] args) { //通过静态工厂创建对象 OrderDao orderDao = OrderDaoFactory.getOrderDao(); orderDao.save(); } }
-
在 spring 的配置文件 application.properties 中添加以下内容:
<bean id="orderDao" class="com.itheima.factory.OrderDaoFactory" factory-method="getOrderDao"/>
-
在 AppForInstanceOrder 运行类,使用从 IOC 容器中获取 bean 的方法进行运行测试
public class AppForInstanceOrder { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); OrderDao orderDao = (OrderDao) ctx.getBean("orderDao"); orderDao.save(); } }
方式三:实例工厂实例化
-
准备一个 UserDao 和 UserDaoImpl 类
public interface UserDao { public void save(); } public class UserDaoImpl implements UserDao { public void save() { System.out.println("user dao save ..."); } }
-
创建一个工厂类 OrderDaoFactory 并提供一个普通方法,注意此处和静态工厂的工厂类不一样的地方是方法不是静态方法
public class UserDaoFactory { public UserDao getUserDao(){ return new UserDaoImpl(); } }
-
编写 AppForInstanceUser 运行类,在类中通过工厂获取对象
public class AppForInstanceUser { public static void main(String[] args) { //创建实例工厂对象 UserDaoFactory userDaoFactory = new UserDaoFactory(); //通过实例工厂对象创建对象 UserDao userDao = userDaoFactory.getUserDao(); userDao.save(); }
-
在 spring 的配置文件中添加以下内容:
<bean id="userFactory" class="com.itheima.factory.UserDaoFactory"/> <bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
-
在 AppForInstanceUser 运行类,使用从 IOC 容器中获取 bean 的方法进行运行测试
public class AppForInstanceUser { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) ctx.getBean("userDao"); userDao.save(); } }
方式四:FactoryBean 的使用
-
创建一个 UserDaoFactoryBean 的类,实现 FactoryBean 接口,重写接口的方法
public class UserDaoFactoryBean implements FactoryBean<UserDao> { //代替原始实例工厂中创建对象的方法 public UserDao getObject() throws Exception { return new UserDaoImpl(); } //返回所创建类的Class对象 public Class<?> getObjectType() { return UserDao.class; } }
-
在 Spring 的配置文件中进行配置
<bean id="userDao" class="com.itheima.factory.UserDaoFactoryBean"/>
FactoryBean 接口其实会有三个方法,分别是:
T getObject() throws Exception;
Class<?> getObjectType();
default boolean isSingleton() {
return true;
}
方法一: getObject(),被重写后,在方法中进行对象的创建并返回
方法二: getObjectType(),被重写后,主要返回的是被创建类的 Class 对象
方法三: 没有被重写,因为它已经给了默认值,设置对象是否为单例,默认 true