博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
彻底搞懂Spring类加载(注解方式)
阅读量:5232 次
发布时间:2019-06-14

本文共 3144 字,大约阅读时间需要 10 分钟。

  • 单例预加载默认
  • 单例懒加载
    •   正确的加载时机
    •   错误的加载时机
  • 多例懒加载仅支持懒加载
  • spring beanfactory类高级用法
    •   反射方式加载类
  • 需要注意的问题

 


通过 Spring 注册的类一共只有三种加载方式!

环境: 

spring-context 4.2.6 
jdk 8 
Eclipse 4.7

最简单的配置

入口方法:

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 接口创建实例    @Autowired    BeanFactory 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 接口创建实例    @Autowired    BeanFactory 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 {    @Autowired    BeanFactory beanFactory;    public TestDemo (){        beanFactory.getBean("test",Test.class);    }}

 

转载于:https://www.cnblogs.com/rinack/archive/2013/01/11/2856012.html

你可能感兴趣的文章
Nhiberate (一)
查看>>
c#后台计算2个日期之间的天数差
查看>>
安卓开发中遇到的小问题
查看>>
ARTS打卡第3周
查看>>
linux后台运行和关闭SSH运行,查看后台任务
查看>>
cookies相关概念
查看>>
CAN总线波形中ACK位电平为什么会偏高?
查看>>
MyBatis课程2
查看>>
桥接模式-Bridge(Java实现)
查看>>
svn客户端清空账号信息的两种方法
查看>>
springboot添加servlet的两种方法
查看>>
java的Array和List相互转换
查看>>
layui父页面执行子页面方法
查看>>
如何破解域管理员密码
查看>>
Windows Server 2008 R2忘记管理员密码后的解决方法
查看>>
IE11兼容IE8的设置
查看>>
windows server 2008 R2 怎么集成USB3.0驱动
查看>>
Foxmail:导入联系人
查看>>
vue:axios二次封装,接口统一存放
查看>>
vue中router与route的区别
查看>>