zoukankan      html  css  js  c++  java
  • spring-如何在项目启动的情况下获取Bean实例

    大家都知道,项目启动的时候,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这个监听器就不多说了。

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

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

  • 相关阅读:
    dock 安装部署和初级管理命令
    3 gogs+jenkins 触发远程构建及tomcat管理war包替换
    2 gitlab+jenkins maven自动打包更新
    1 gitlab+jenkins 自动化部署 持续集成
    Day7 面向对象进阶
    Day 6 面向对象初级
    day4 迭代器&生成器&递归&json&正则
    day5 常用模块
    day3 函数
    day2 数据及文件操作
  • 原文地址:https://www.cnblogs.com/jpfss/p/9447973.html
Copyright © 2011-2022 走看看