Spring的IOC容器实例化bean的方式总结
IOC容器实例化bean的三种方式:构造方法、静态工厂、实例工厂。 本文章涉及工程目录如下:
IOC容器实例化bean的三种方式
构造方法
对象在new的时候通过构造方法完成实例化。bean本质是对象,也可以通过构造方法完成实例化。
涉及代码片
。
// applicationContext.xml <bean id="flowService" class="com.lwb.services.impl.FlowServiceImpl">
// FlowServiceImpl.java public class FlowServiceImpl implements FlowService { private FlowServiceImpl(){ System.out.println(this.getClass() + "-----进入FlowServiceImpl" + "无参构造器"); } @Override public void saveService() { System.out.println(this.getClass() + "-----进入FlowServiceImpl"); } }
// App.java public class App { public static void main(String[] args){ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } }
执行后返回结果:
思考:
1、构造方法底层是通过反射机制实现的。注意上面无参构造方法是private,只有反射才能访问到私有方法。
2、底层使用的是无参构造方法。可以写一个带参的构造方法进行验证,会报错。
静态工厂
涉及代码片
。
// applicationContext.xml <!--静态工厂实例化方法 class为静态工厂类路径,factory-method 为方法名 --> <bean id="flowDao1" class="com.lwb.factory.FlowDaoStaticFactory" factory-method="getFlowDao"/>
// FlowDaoStaticFactory.java //注意getFlowDao是static的,所以叫静态工厂 public class FlowDaoStaticFactory { public static FlowDao getFlowDao(){ System.out.println("-----进入静态工厂方法StaticFactory"); return new FlowDaoImpl(); } }
// App.java public class App { public static void main(String[] args){ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } }
执行后返回结果:
思考:
1、为什么使用静态工厂方法,而不直接去new? 静态工厂方法在返回new的对象实例之前,可以实现一些业务逻辑,如代码中的日志输出。
实例工厂
涉及代码片
。
// applicationContext.xml <bean id="flowDaoExFactory" class="com.lwb.factory.FlowDaoExFactory"/> <bean id="flowDao2" factory-method="getFlowDao" factory-bean="flowDaoExFactory"/>
// FlowDaoExFactory .java //注意getFlowDao是public的,对比静态工厂 public class FlowDaoExFactory { public FlowDao getFlowDao(){ System.out.println(this.getClass() + "------进入实例工厂类FlowDaoExFactory"); return new FlowDaoImpl(); } }
// App.java public class App { public static void main(String[] args){ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } }
执行后返回结果:
思考:
1、静态工厂和实例工厂的区别?
静态工厂方法是static的,是在类加载的时候就创建了,可以直接使用,不需要实例化工厂类。实例工厂是public的,需要先实例化,才能使用。静态工厂适合实时性很高的场景。实际场景中大部分使用实例工厂。
2、实例工厂的简单写法——FactoryBean
涉及代码片。
// applicationContext.xml <bean id="flowDao3" class="com.lwb.factory.FlowDaoFactoryBean"/>
// FlowDaoFactoryBean .java public class FlowDaoFactoryBean implements FactoryBean<FlowDao> { //返回实例化对象 @Override public FlowDao getObject() throws Exception{ System.out.println(this.getClass() + "------进入实例工厂FlowDaoFactoryBean,getObject"); return new FlowDaoImpl(); } //返回class对象 @Override public Class<?> getObjectType() { System.out.println(this.getClass() + "------进入实例工厂FlowDaoFactoryBean,getObjectType"); return FlowDao.class; } }
// App.java public class App { public static void main(String[] args){ ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); } }
思考:
1、为什么只输出了getObject()里面的内容?getObject()重写了返回实例化对象的方法。getObjectType()返回的是class对象,只有在调用的时候才会执行(反射?)
2、FlowDaoFactoryBean可以通过重写isSingleton()方法声明是否是单例。
思考
1、上述例子中App.java为什么不获取bean(执行FlowDao flowDao = (FlowDao) ctx.getBean("flowDao3")),也能实例化?
IOC实例化bean对象的时机:
(1)IOC初始化的bean对象默认是单例的。单例+懒加载会在ioc容器初始化完成后直接实例化所有bean对象供使用。
(2)非单例和单例+非懒加载。在使用bean的时候才会去初始化。
以上就是Spring的IOC容器实例化bean的方式总结的详细内容,更多关于Spring IOC容器实例化bean的资料请关注脚本之家其它相关文章!
相关文章
SpringSecurity中的Filter Chain(过滤器链)
Spring Security的Filter Chain是由一系列过滤器组成的管道,每个过滤器执行特定的安全功能,Spring Security能够提供强大而灵活的安全控制机制,从而保护你的应用程序不受各种网络安全威胁的侵害,本文介绍SpringSecurity中的Filter Chain,感兴趣的朋友跟随小编一起看看吧2024-06-06SpringBoot使用ApplicationEvent&Listener完成业务解耦
这篇文章主要介绍了SpringBoot使用ApplicationEvent&Listener完成业务解耦示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-05-05spring cloud中启动Eureka Server的方法
本篇文章主要介绍了spring cloud中启动Eureka Server的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2018-01-01Java并发读写锁ReentrantReadWriteLock 使用场景
ReentrantReadWriteLock是Java中一种高效的读写锁,适用于读多写少的并发场景,它通过允许多个线程同时读取,但在写入时限制为单线程访问,从而提高了程序的并发性和性能,本文给大家介绍Java并发读写锁ReentrantReadWriteLock 使用场景,感兴趣的朋友跟随小编一起看看吧2024-10-10
最新评论