彻底搞懂Spring类加载(注解方式)
- 单例预加载默认
- 单例懒加载
- 正确的加载时机
- 错误的加载时机
- 多例懒加载仅支持懒加载
- spring beanfactory类高级用法
- 反射方式加载类
- 需要注意的问题
通过 Spring 注册的类一共只有三种加载方式!
环境:
spring-context 4.2.6
jdk 8
Eclipse 4.7
最简单的配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd"><!-- 扫描注解 --><context:component-scan base-package="org.foo" /></beans>
入口方法:
import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringEntrance {public static void main(String[] args){ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext(new String[]{"applicationContext.xml"}); }}
项目结构:
src└── main└── java ├── applicationContext.xml └── org └── foo ├── service │├── TestDemo.java │└── Test.java └── SpringEntrance.java
单例+预加载(默认)
//项目一启动就产生一个且仅一个实例,即单例。//并且,通过 @Autowired 只能获得这个单例。new Test()则不受单例限制@Componentpublic class Test{}
单例+懒加载
//项目启动时不加载//仅当 TestDemo 类的 @Autowired Test 被扫描到时,才生成 Test 类的一个且仅一个实例。//并且,通过 @Autowired 只能获得这个单例。new Test()则不受单例限制@Lazy@Componentpublic class Test{}
正确的加载时机
package org.foo.service;import javax.annotation.PostConstruct;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class TestDemo {//禁止使用 @Autowired 标签加载 @Lazy 的类// @Autowired // TestSingle testSingle;//通过 BeanFactory 接口创建实例@AutowiredBeanFactory beanFactory;public void doSth(){//test 是 Test 类名首字母小写!一定要首字母小写!//只有运行到这里 Test 类才被实例化,延迟加载成功TestSingle ts=(TestSingle) beanFactory.getBean("test");}}
错误的加载时机:
//懒加载无效//项目启动时 TestDemo 被加载时,扫描 @Autowired 标签,生成 Test 的单例@Componentpublic class TestDemo{@Autowired // 项目启动时,这里就会创建 Test 的单例,Test 类的懒加载无效Test test; }
多例+懒加载(仅支持懒加载)
定义
//每个 @Autowired 生成一个实例,可以有多个实例@Scope("prototype")//@Lazy //无论加不加 @Lazy,被 @Scope("prototype") 修饰的类都会 懒加载。@Componentpublic class Test{}
调用:
package org.foo.service;import javax.annotation.PostConstruct;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class TestDemo {//禁止使用 @Autowired 标签加载 @Lazy 的类// @Autowired // TestSingle testSingle;//通过 BeanFactory 接口创建实例@AutowiredBeanFactory beanFactory;public void doSth(){Test test = null;for(int i=0;i<10;i++) {//test 是 Test 类名首字母小写!一定要首字母小写!//只有运行到这里 Test 类才被实例化,延迟加载成功test = (Test) beanFactory.getBean("test");}}}
spring beanfactory类高级用法
反射方式加载类
beanFactory.getBean(task.getHandler() + "UrlSpider", // 反射获得子类AbstractUrlSpider.class ); // 返回父类型
需要注意的问题
构造函数里不支持 @Autowired 的实例
package org.foo.service;import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class TestDemo {@AutowiredBeanFactory beanFactory;public TestDemo (){beanFactory.getBean("test",Test.class);}}
作者:如.若
来源链接:https://www.cnblogs.com/rinack/archive/2013/01/11/2856012.html
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。