大家都知道,项目启动的时候,spring读取xml文件,将配置的bean 或者 注解下的controller service dao全部实例化。然后注入到代码里去使用。那么我们怎么自己去获取某个实例化的bean呢。自己new是没用的。

举个场景,

假设我写了一个类

public class A{

@Resource

private static ADao aDao;

static{

  aDao.select();

}

public static void getA(){

 ...

}

}

当 别的类里调用A.getA()的时候,调用的是静态方法,A并不会实例化,只是初始化,也就是说aDao-null;

可能会觉得我设定这个A类很奇葩,但是有的场景就是这样,为了提高性能,我只允许查库一次,以后读取内存。(不放到redis为了安全),所以就要用只会第一次初始化才会被执行的静态代码块。

这个时候我就需要自己去获取aDao了。

那么怎么获取呢?

首先我们要知道几个问题

1, aDao已经实例化了,只是在spring容器中,还不知道怎么去取。

2,如果用的mybatis的接口式编程,那么aDao只是一个接口,他的实现类是MapperFactoryBean,并不是本身,

<bean id="aDap" class=" .../.../aDao"/>这种写法是错误的。

3, ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");

context.getBean("BeanName");

这种做法是平常测试的时候,在不启动spring的时候的一种加载配置文件实例化bean的方法。

在一个正常启动的项目中,这样做是不对的,会使spring重新实例化,重新建立数据库连接池。这相当于重启一个正在运行的项目,是很严重的。

所以我们要用spring给我们提供的接口去搞。

方法一:实现BeanFactoryAware接口

代码如下:

@Service
public class BeanUtils implements BeanFactoryAware {
    // Spring的bean工厂
    private static BeanFactory beanFactory;
    @Override
    public void setBeanFactory(BeanFactory factory) throws BeansException {
        beanFactory=factory;
    }
    public static<T> T getBean(String beanName){
           return (T) beanFactory.getBean(beanName);
    }
}

这个类的意思大体这么几个

1,实现BeanFactoryAware接口,这个接口可以让我们在项目启动后获取bena工厂的实例,从而随心所欲的获取我们想要的bean实例。

2,setBeanFactory()方法是用的spring的依赖注入,set方法是三种注入方式之一。这样实例才会注入到该类里。

既然要注入,那么我们必须设置BeanUtils这个类也要在项目启动的时候被spring实例化,我这里是采用注解的方式@service来实现。

3,静态getBean方法,这里方法必须是静态的,因为你如果自己去new这个BeanUtils类的话,beanFactory是不会被注入进去的。

方法二,非常简单的一种用法。

ContextLoaderListener.getCurrentWebApplicationContext().getBean ("beanName");

使用 上下文监听器去获取上下文,然后获取bean,这个方法细心的同学应该能看到,这是上面我讲的一种错误用法的改变。3, ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");,用一句话概述就是,new是不管用的,从容器中拿出来才是正道。

关于ContextLoaderListener这个监听器就不多说了。

这里只列出两种,还有几种方式,也可以获取。

如果哪里解释的不对,希望大神指点下小弟,毕竟自己摸索,难免会出错。


spring-如何在项目启动的情况下获取Bean实例的更多相关文章

  1. Spring源码剖析4:其余方式获取Bean的过程分析

    原型Bean加载过程 之前的文章,分析了非懒加载的单例Bean整个加载过程,除了非懒加载的单例Bean之外,Spring中还有一种Bean就是原型(Prototype)的Bean,看一下定义方式: 1 ...

  2. 解决 RecyclerView 在Android Studio已经导入情况下还无法实例引用问题

    系统:Windows 10 IDE::android studio 1. 问题:RecyclerView 在Android Studio已经导入情况下还无法实例引用问题 由于RecyclerView是 ...

  3. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. Spring(六)核心容器 - 注册单例 Bean 实例、SingletonBeanRegistry 简介

    前言 上篇文章我们对注册 Bean 的核心类 BeanDefinitionRegistry 进行了讨论,这里的注册 Bean 是指保存 Bean 的相关信息,也就是将 Bean 定义成 BeanDef ...

  5. spring读取配置文件,且获取bean实例

    import org.springframework.beans.factory.BeanFactory;import org.springframework.beans.factory.xml.Xm ...

  6. 解决spring boot在RabbitMQ堆积消息情况下无法启动问题

    最近遇到一个问题,服务站点上线之前,先去新建需要的rabbitmq并绑定关系,此时 如果发送消息方运行, 那边会造成新建的q消息部分堆积得不到及时消费 那么问题来了? 在消息堆积情况下,服务站点无法启 ...

  7. 基于spring的web项目启动时预加载数据到ServletContext

    1.要在web启动时预加载数据到ServletContext,实现方法有很多,一种比较简单的方案就是: 1)新建一个bean,定义其初始化方法: <bean id="beanId&qu ...

  8. 【Spring容器】项目启动后初始化数据的两种实践方案

    早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员 ...

  9. asp.net网站,在没有项目源码情况下的扩展

    如果在没有源码的情况下,要扩展asp.net网站,可以自己新增一个类库项目,在里面添加需要扩展的类,代码如下: using System; using System.Collections.Gener ...

随机推荐

  1. Java中JVM虚拟机详解

    1. 什么是JVM? JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来 ...

  2. 设计模式(7)-结构型模式-Bridge模式

    2.结构性模式 2.2  BRIDGE模式 别名:handle/body 这个模式体现了组合相对于继承的优势. 2.2.1动机 当一个抽象可能有多个实现时,通经常使用继承来协调它们.抽象类定义对该抽象 ...

  3. LinearLayout -设置负值属性

    1.我们调整两个控件的位置的时候,数值不仅仅是正数,负的也行,这时候只不过是跑到相对位置的另一边去了,例如 <ImageView android:id="@+id/image" ...

  4. 为什么会出现NoSQL数据库

    为什么会出现NoSQL数据库 一.总结 一句话总结:sql不支持分布式且且有性能瓶颈且不支持分布式,不同NoSQL适合不同的场景 1."不同的NoSQL数据库只适合不同的场景"这句 ...

  5. 淘宝的css初始化代码

    ;; } body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; } h1, h2, h3, h ...

  6. Cisco安全防护读书笔记之一Cisco系统设备协议漏洞

    650) this.width=650;" onclick='window.open("http://blog.51cto.com/viewpic.php?refimg=" ...

  7. Java 批量修改文件后缀

    import java.io.*; public class test { public void reName(String path, String from, String to) { File ...

  8. wps如何输入连续的长破折号

    最近在写论文, 想输入破折号,结果是— — 这个破折号中间是有缝隙的, 如何变成没有缝隙. 第一步,选中: 第二步,右击选择字体 第三步,放大(只加一个破折号,然后放大到200%) 不知道有没有人,像 ...

  9. codeforces 204E. Little Elephant and Strings(广义后缀自动机,Parent树)

    传送门在这里. 大意: 给一堆字符串,询问每个字符串有多少子串在所有字符串中出现K次以上. 解题思路: 这种子串问题一定要见后缀自动机Parent树Dfs序统计出现次数都是套路了吧. 这道题统计子串个 ...

  10. HTML基础第七讲---框架

    转自:https://i.cnblogs.com/posts?categoryid=1121494 框架(Frame)也就是所谓的分割窗口.分割画面.框窗效果(还真是五花八门),这个技巧在运用上问题比 ...