当前位置: 首页 > 后端技术 > Java

Spring获取bean的八种方式,你中了几种?

时间:2023-04-02 10:03:15 Java

1。初始化时保存ApplicationContext对象,适用于Spring框架的独立应用,程序需要通过配置文件初始化Spring。applicationContext.xml配置:代码:@Testpublicvoidtest(){ApplicationContextapplicationContext=newClassPathXmlApplicationContext("applicationContext.xml");//ApplicationContextapplicationContext=newFileSystemXmlApplicationContext("applicationContext.xml");测试test=(测试)applicationContext.getBean("test");.out.println(test);}2.通过Spring提供的工具类获取ApplicationContext对象。适用于Spring框架的B/S系统。getContext对象获取ApplicationContext对象,然后通过它获取需要的类实例。下面两种工具方法的区别在于前者在获取失败时会抛出异常。后者返回null。ApplicationContextac1=WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContextsc);ApplicationContextac2=WebApplicationContextUtils.getWebApplicationContext(ServletContextsc);ac1.getBean("beanId");ac2.getBean("beanId");3、实现接口ApplicationContextAware(推荐)实现该接口的setApplicationContext(ApplicationContextcontext)方法,并保存ApplicationContext对象。Spring在初始化的时候,扫描这个类的时候,会通过这个方法注入ApplicationContext对象。然后就可以在代码中获取spring容器bean了。例如:Userbean=SpringUtils.getBean(“user”);@ComponentpublicclassSpringUtilsimplementsApplicationContextAware{privatestaticApplicationContextapplicationContext;@OverridepublicvoidsetApplicationContext(ApplicationContextapplicationContext)throwsBeansException{SpringUtils.applicationContext=applicationContext;}publicstaticTgetBean(StringbeanName){if(applicationContext.containsBean(beanName)){return(T)applicationContext.getBean(beanName);}else{返回空;}}publicstaticMapgetBeansOfType(ClassbaseType){returnapplicationContext.getBeansOfType(baseType);}}4、继承自抽象类ApplicationObjectSupport调用父类的getApplicationContext()方法,获取Spring容器对象。@ServicepublicclassSpringContextHelperextendsApplicationObjectSupport{publicObjectgetBean(StringbeanName){returngetApplicationContext()。(StringbeanName){returngetApplicationContext().getBean(beanName);}}6.使用BeanFactory直接获取(不推荐)使用BeanFactory直接从工厂获取Bean实例,但是XmlBeanFactory类已经废弃,不推荐使用。@Testpublicvoidtest(){BeanFactorybeanFactory=newXmlBeanFactory(newClassPathResource("applicationContext.xml"));测试test=(测试)beanFactory.getBean("test");System.out.println(test);}7、使用ContextLoader提供的getCurrentWebApplicationContext方法@Testpublicvoidtest(){MockServletContextsc=newMockServletContext("");sc.addInitParameter(ContextLoader.CONFIG_LOCATION_PARAM,"/applicationContext.xml");ServletContextListenerlistener=newContextLoadervListenerev(text);=新的ServletContextEvent(sc);listener.contextInitialized(事件);WebApplicationContextwac=ContextLoader.getCurrentWebApplicationContext();测试test=(测试)wac.getBean("测试");System.out.println(test);}8、实现接口BeanFactoryPostProcessorspring工具类,方便在非spring管理环境下获取bean@ComponentpublicfinalclassSpringUtilsSimplementsBeanFactoryPostProcessor{/**Spring应用上下文*/私有静态ConfigurableListableBeanFactorybeanFactory;@OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException{SpringUtilsS.beanFactory=beanFactory;}/***获取对象**@paramname*@returnObjectbean实例*用给定名称注册@throwsBeansException**/@SuppressWarnings("unchecked")publicstaticTgetBean(Stringname)throwsBeansException{返回(T)beanFactory.getBean(名称);}/***获取requiredType类型的对象**@paramclz*@return*@throwsBeansException**/publicstaticTgetBean(Classclz)throwsBeansException{Tresult=(T)beansFactory.getBean(clz);返回结果;}/***如果BeanFactory包含与给定名称匹配的bean定义,则返回true**@paramname*@returnboolean*/publicstaticbooleancontainsBean(Stringname){返回beanFactory.containsBean(名称);}/***判断以给定名称注册的bean定义是单例还是原型如果没有找到给定名称对应的bean定义,将抛出异常(NoSuchBeanDefinitionException)**@paramname*@returnboolean*@throwsNoSuchBeanDefinitionException**/publicstaticbooleanisSingleton(Stringname)throwsNoSuchBeanDefinitionException{returnbeanFactory.是单身人士(姓名);}/***@paramname*@returnClass注册对象的类型*@throwsNoSuchBeanDefinitionException**/publicstaticClassgetType(Stringname)throwsNoSuchBeanDefinitionException{returnbeanFactory.getType(name);}/***如果给定的bean名称在bean定义中有别名,则返回这些别名**@paramname*@return*@throwsNoSuchBeanDefinitionException**/publicstaticString[]getAliases(Stringname)throwsNoSuchBeanDefinitionException{returnbeanFactory.getAliases(名字);}/***获取aop代理对象**@paraminvoker*@return*/@SuppressWarnings("unchecked")publicstaticTgetAopProxy(Tinvoker){return(T)AopContext.currentProxy();}}}ExtendedBeanFactory和ApplicationContext是Spring的两个核心接口,都可以作为Spring的容器。ApplicationContext是BeanFactory的子接口。BeanFactory(1)是Spring中的底层接口(最原始的接口),包含了各种bean的定义,读取bean的配置文档,管理bean的加载和实例化,控制bean的生命周期,维护之间的bean依赖关系。(2)bean以延迟加载的形式注入,即只在使用一个bean时(调用getBean())才加载并实例化bean。这样一来,我们就无法发现一些现有的Spring配置问题。如果Bean的某个属性没有被注入,BeanFacotry加载后,直到第一次调用getBean方法才会抛出异常。(3)BeanFactory通常是通过编程方式创建的。(4)BeanFactory和ApplicationContext都支持BeanPostProcessor和BeanFactoryPostProcessor的使用,但是两者的区别在于:BeanFactory需要手动注册,而ApplicationContext是自动注册的。(5)内存占用小。ApplicationContext1和ApplicationContext接口派生自BeanFactory。它们除了提供BeanFactory的功能外,还提供了更完善的框架功能:继承MessageSource,所以支持国际化。统一的资源文件访问方式。提供事件以在侦听器中注册bean。同时加载多个配置文件。加载多个(继承的)上下文,每个上下文专用于特定层,例如应用程序的Web层。2.ApplicationContext,在容器启动的时候一次性创建所有的bean。这样在容器启动的时候,我们就可以发现Spring的配置错误,有利于检查依赖的属性是否被注入。ApplicationContext启动后,所有的单实例bean都会被预加载。通过预加载单实例bean,您可以确保在需要它们时,您不必等待,因为它们已经被创建。3、ApplicationContext占用内存空间大。当程序有很多配置bean时,程序启动很慢。4.ApplicationContext可以通过编程方式或声明方式创建,例如使用ContextLoader。

最新推荐
猜你喜欢