当前位置: 首页 >服务端 > 彻底搞懂Spring类加载(注解方式)

彻底搞懂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),我们将第一时间核实后及时予以删除。





本文链接:https://www.javaclub.cn/server/113345.html

标签:Spring注解
分享给朋友: