通过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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)