方维o2o 2.9蓝色团购网站程序源码模板,惠州市注册公司,山东东平建设工程招标网站,智慧城市o2o wordpress对象已经能交给Spring的IOC容器来创建了#xff0c;但是容器是如何来创建对象的呢?
就需要研究下bean的实例化过程#xff0c;在这块内容中主要解决两部分内容#xff0c;分别是
bean是如何创建的实例化bean的三种方式#xff0c;构造方法,静态工厂和实例工厂
在讲解这…对象已经能交给Spring的IOC容器来创建了但是容器是如何来创建对象的呢?
就需要研究下bean的实例化过程在这块内容中主要解决两部分内容分别是
bean是如何创建的实例化bean的三种方式构造方法,静态工厂和实例工厂
在讲解这三种创建方式之前我们需要先确认一件事:
bean本质上就是对象对象在new的时候会使用构造方法完成那创建bean也是使用构造方法完成的。
基于这个知识点出发我们来验证spring中bean的三种创建方式。
1 构造方法实例化
内部走的依然是构造函数,能访问到类中的私有构造方法,显而易见Spring底层用的是反射
编写java 类
public interface BookDao {public void save();
}public class BookDaoImpl implements BookDao {public BookDaoImpl() {System.out.println(book dao constructor is running ....);}public void save() {System.out.println(book dao save ...);}}
将类配置到Spring容器
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdbean idbookDao classcom.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();}
}由此可知说明Spring容器在创建对象的时候也走的是构造函数且在容器启动的时候就创建
2实例工厂与FactoryBean
(1)准备一个UserDao和UserDaoImpl类
public interface UserDao {public void save();
}public class UserDaoImpl implements UserDao {public void save() {System.out.println(user dao save ...);}
}(2)创建一个工厂类userDaoFactory并提供一个普通方法注意此处和静态工厂的工厂类不一样的地方是方法不是静态方法
public class UserDaoFactory {public UserDao getUserDao(){return new UserDaoImpl();}
}(3实例工厂实例化配置
bean iduserFactory classcom.itheima.factory.UserDaoFactory/
bean iduserDao factory-methodgetUserDao factory-beanuserFactory/实例化工厂运行的顺序是: 创建实例化工厂对象,对应的是第一行配置 调用对象中的方法来创建bean对应的是第二行配置 factory-bean:工厂的实例对象 factory-method:工厂对象中的具体创建对象的方法名,对应关系如下: factory-mehod:具体工厂类中创建对象的方法名
4在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();}
}(5)运行后可以查看到结果
4.2.3.3 FactoryBean的使用
上述实例工厂实例化的方式配置的过程还是比较复杂所以Spring为了简化这种配置方式就提供了一种叫FactoryBean的方式来简化开发。 具体的使用步骤为: (1)创建一个UserDaoFactoryBean的类实现FactoryBean接口重写接口的方法
public class UserDaoFactoryBean implements FactoryBeanUserDao {//代替原始实例工厂中创建对象的方法Overridepublic UserDao getObject() throws Exception {// 实际创建并返回 UserDao 实例的地方return new UserDao();}Overridepublic Class? getObjectType() {// 返回由这个工厂创建的对象的类型return UserDao.class;}Overridepublic boolean isSingleton() {// 指定是否每次调用都返回同一个实例return true;}
}解释 在Java中Class? 是一个泛型类型表示未知类型的类。当你使用 return UserDao.class; 这样的语句时你实际上是在返回一个代表 UserDao 类的 Class 对象。 在这个例子中UserDaoFactory 类实现了 FactoryBean 接口并重写了 getObjectType() 方法来指定它生产的对象是 UserDao 类型的。这样当其他代码通过工厂获取对象时它们可以知道应该期待什么类型的对象。
(2)在Spring的配置文件中进行配置
bean iduserDao classcom.itheima.factory.UserDaoFactoryBean/(3)AppForInstanceUser运行类不用做任何修改直接运行 这种方式在Spring去整合其他框架的时候会被用到所以这种方式需要大家理解掌握。
查看源码会发现FactoryBean接口其实会有三个方法分别是:
T getObject() throws Exception;Class? getObjectType();default boolean isSingleton() {return true;
}方法一:getObject()被重写后在方法中进行对象的创建并返回
方法二:getObjectType(),被重写后主要返回的是被创建类的Class对象
方法三:没有被重写因为它已经给了默认值从方法名中可以看出其作用是设置对象是否为单例默认true也可以重写成fause。但是一般情况下我们都会采用单例也就是采用默认即可。所以isSingleton()方法一般不需要进行重写。
bean实例化小结
Spring的IOC实例化对象的三种方式分别是:
构造方法(常用)静态工厂(了解)实例工厂(了解) FactoryBean(实用)
这些方式中重点掌握构造方法和FactoryBean即可。
需要注意的一点是构造方法在类中默认会提供但是如果重写了构造方法默认的就会消失在使用的过程中需要注意如果需要重写构造方法最好把默认的构造方法也重写下。
[说明]内容主要来源黑马程序员网上资源学习