除了autoware其他获取注解bean的方式

除了autoware其他获取注解bean的方式,第1张

通过bring程序获取。

最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的ApplicationContextAware,在setApplicationContext中去通过ctx获取所有的bean。

后来发现好像逻辑不对,这个方法不是在所有bean初始化完成后实现的,后来试了一下看看有没有什么Listener之类的,发现了好东西ApplicationListener,然后百度一下ApplicationListener用法。

spring的bean生命周期其实最核心的分为4个步骤,只要理清三个关键的步骤,其他的只是在这三个细节中添加不同的细节实现,也就是spring的bean生命周期:

-InstantiationAwareBeanPostProcessorpostProcessBeforeInstantiation();

这个阶段允许在Bena进行实例化之前,允许开发者自定义逻辑,如返回一个代理对象。不过需要注意的是假如在这个阶段返回了一个不为null的实例,spring就会中断后续的过程。

-BeanPostProcessorpostProcessAfterInstantiation();

这个阶段是Bean实例化完毕后执行的后处理 *** 作,所有在初始化逻辑、装配逻辑之前执行

该方法在bean初始化方法前被调用,Spring AOP的底层处理也是通过实现BeanPostProcessor来执行代理逻辑的

自定义属性值 该方法允许我们进行对对象中的属性进行设置,假如在某些业务中,一个对象的某些属性为null,但是不能显示为null,比如显示0或者其他的固定数值,我们就可以在这个方法实现中将null值转换为特定的值

可以在这个方法中进行bean的实例化之后的处理,比如我们的自定义注解,对依赖对象的版本控制自动路由切换。比如有一个服务依赖了两种版本的实现,我们如何实现自动切换呢?这时候可以自定义一个路由注解,假如叫@RouteAnnotaion,然后实现BeanPostProcessor接口,在其中通过反射拿到自定义的注解@RouteAnnotaion再进行路由规则的设定。

容器正式渲染完毕,开始启动阶段,bean已经在spring容器的管理下,程序可以随时调用

spring会将所有的bean销毁,实现的bean实例被销毁的时候释放资源被调用

package comloonewfweb;  

  

import orgspringframeworkbeansBeansException;  

import orgspringframeworkbeansfactoryNoSuchBeanDefinitionException;  

import orgspringframeworkcontextApplicationContext;  

import orgspringframeworkcontextApplicationContextAware;  

  

  Spring ApplicationContext 获取spring容器中的实例bean 

  @author ruilinxie 

  

 /  

public class WebContextFactoryUtil implements ApplicationContextAware  

{  

    / 

      Spring 应用上下文环境 

     /  

    private static ApplicationContext applicationContext;  

  

    / 

      实现ApplicationContextAware接口的回调方法,设置上下文环境 

       

      @param applicationContext 

      @throws BeansException 

     /  

    @SuppressWarnings("static-access")  

    public void setApplicationContext(ApplicationContext applicationContext)  

            throws BeansException  

    {  

        thisapplicationContext = applicationContext;  

    }  

  

    / 

      @return ApplicationContext 

     /  

    public static ApplicationContext getApplicationContext()  

    {  

        return applicationContext;  

    }  

  

    / 

      获取对象 

       

      @param name 

      @return Object bean的实例 

      @throws BeansException 

     /  

    public static Object getBean(String beanName) throws BeansException  

    {  

        if (!WebContextFactoryUtilcontainsBean(beanName))  

        {  

            return null;  

        } else  

        {  

            return applicationContextgetBean(beanName);  

        }  

    }  

  

    / 

      获取类型为requiredType的对象 

      如果bean不能被类型转换,相应的异常将会被抛出(BeanNotOfRequiredTypeException) 

       

      @param name 

                 bean注册名 

      @param requiredType 

                 返回对象类型 

      @return Object 返回requiredType类型对象 

      @throws BeansException 

     /  

    @SuppressWarnings({ "unchecked", "rawtypes" })  

    public static Object getBean(String name, Class requiredType)  

            throws BeansException  

    {  

        return applicationContextgetBean(name, requiredType);  

    }  

  

    / 

      如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true 

       

      @param name 

      @return boolean 

     /  

    public static boolean containsBean(String name)  

    {  

        return applicationContextcontainsBean(name);  

    }  

  

    / 

      判断以给定名字注册的bean定义是一个singleton还是一个prototype。 

      如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) 

       

      @param name 

      @return boolean 

      @throws NoSuchBeanDefinitionException 

     /  

    public static boolean isSingleton(String name)  

            throws NoSuchBeanDefinitionException  

    {  

        return applicationContextisSingleton(name);  

    }  

  

    / 

      @param name 

      @return Class 注册对象的类型 

      @throws NoSuchBeanDefinitionException 

     /  

    @SuppressWarnings("rawtypes")  

    public static Class getType(String name)  

            throws NoSuchBeanDefinitionException  

    {  

        return applicationContextgetType(name);  

    }  

  

    / 

      如果给定的bean名字在bean定义中有别名,则返回这些别名 

       

      @param name 

      @return 

      @throws NoSuchBeanDefinitionException 

     /  

    public static String[] getAliases(String name)  

            throws NoSuchBeanDefinitionException  

    {  

        return applicationContextgetAliases(name);  

    }  

  

}

首先spring有个总配置,下面有N多各个方面的配置(都是HashMap),配置里面包括了你配置的各个类之间的依赖关系,IoC工作之前,首先是创建需要管理的对象,存入HashMap,然后根据配置,得到需要注入字段的PropertyDescriptor,直接set就可以了(当然,之前可以强制

isAccessible为true,忽略private)以上说的是spring注入中最推荐的一种---使用set方法还有两种,一种的构造,一种是接口个人觉得比set差一点

以上就是关于除了autoware其他获取注解bean的方式全部的内容,包括:除了autoware其他获取注解bean的方式、Spring加载Bean流程解析、如何通过类名取spring bean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9515380.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存