如何通过类名取spring bean

如何通过类名取spring bean,第1张

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);  

    }  

  

}

1、web容器启动,开始扫描所有被指定的spring配置文件。 2、根据配置文件,实例化所有的bean对象,以java语法创建。 3、加载spring配置文件配置的对象依赖关系,将有依赖关系的bean注入到相应的对象中。 你这里报错是因为,datasource对象还没有

[引文]通常在struts2+spring的例子上,要想使用spring的Bean,可以在applicationContextxml加上如下配置

<bean id="springBean" scope="prototype" class=""

<property name="name" value="chen"/</bean<bean id="myAction" scope="prototype" class=""

<property name="springBean" ref="springBean"/</bean如果是j2ee应用,启动web应用时将会自动加载ApplicationContext实例(Spring容器负责创建Bean实例)

一旦struts2的myAction实例化,其中的SpringBean也会被自动注入进来,从而达到使用SpringBean的目的。

[问题]但是仍有需要通过代码来调用SpringBean的情况:

1)对于不是由spring创建管理的类,如在java 代码中直接使用new去创建一个对象,并且想在这个对象中使用

SpringBean;因为这个对象并不是由Spring容器创建管理的类,所以即使它有setter方法,容器的springBean也不会被注入。

2)动态更改springBean中的属性值,如在代码运行时,name值需要发生变动;

3)对于一个独立的应用程序[解决]定义一个非Spring容器创建管理的类

public class NonSpringClass implements ServletContextAware {

private SpringBean springBean;

//如果 testGetBean不是被Spring容器创建管理,即使它有setter方法,容器的springBean也不会被注入。

public void setSpringBean(SpringBean springBean){thisspringBean=springBean;}//利用ApplicationContext 从spring容器中获得springBean;

//Spring有两个核心接口BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口,

//它们代表了Spring容器,Spring容器是产生Bean的工厂,用于管理容器中的Bean。

public NonSpringClass (){//ApplicationContext acx = new ClassPathXmlApplicationContext("applicationContextxml");

ApplicationContext acx = new FileSystemXmlApplicationContext("src/WEB-INF/applicationContextxml");

springBean=(SpringBean)acxgetBean("springBean");}}调用这个类的代码:

import comNonSpringClass;

public class TestCode {

private NonSpringClass nonSpringClass;

//这样nonSpringClass里将包含Spring容器创建的springBean}}

ApplicationContextAware

你可以实现这个接口,然后里面会有个方法,你定义一个属性,然后赋值给他就好了,类似这样:

ApplicationContext ctx;

public abstract void setApplicationContext(ApplicationContext applicationcontext)

throws BeansException{

thisctx = applicationcontext;

}

然后你用 ctxgetBean("" ) 应该就能获取到了

要想使用request可以使用下面的方法:

在web点xml中配置一个监听

view plainprint

<listener>

<listener-class>

orgspringframeworkwebcontextrequestRequestContextListener

</listener-class>

</listener>

之后就可以在程序使用了

view

plainprint

>

以上就是关于如何通过类名取spring bean全部的内容,包括:如何通过类名取spring bean、如何不通过依赖注入获取spring环境中的Bean、spring容器已经启动,我怎么动态的加载里面的某个bean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存