1. 程式人生 > >根據不同屬性型別動態獲取不同bean

根據不同屬性型別動態獲取不同bean



第一步:SpringContextUtil工具類直接複製到專案中

import java.util.ArrayList;

import java.util.Collection;

import java.util.HashMap;

import java.util.Map;

import org.apache.commons.lang.ArrayUtils;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationContextAware;

public class SpringContextUtil implements ApplicationContextAware {

private static ApplicationContext applicationContext; // Spring應用上下文環境

/**

 * 實現ApplicationContextAware介面的回撥方法,設定上下文環境

 * @param applicationContext

 * @throws BeansException

 */

public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {

SpringContextUtil.applicationContext = applicationContext;

}

/**

 * @return ApplicationContext

 */

public static ApplicationContext getApplicationContext() {

return applicationContext;

}

/**

 * 獲取物件

 *

 * @param name

 * @return Object 一個以所給名字註冊的bean的例項

 * @throws BeansException

 */

public static Object getBean(String name) throws BeansException {

return applicationContext.getBean(name);

}

/**

 * 獲取型別為requiredType的物件

 * 如果bean不能被型別轉換,相應的異常將會被丟擲(BeanNotOfRequiredTypeException)

 *

 * @param name

 *            bean註冊名

 * @param requiredType

 *            返回物件型別

 * @return Object 返回requiredType型別物件

 * @throws BeansException

 */

public static Object getBean(String name, Class<?> requiredType) throws BeansException {

return applicationContext.getBean(name, requiredType);

}

public static Object getBean(Class<?> requiredType) throws BeansException {

String[] names = applicationContext.getBeanNamesForType(requiredType);

if (ArrayUtils.isEmpty(names)) {

throw new IllegalArgumentException("沒有找到Bean,型別:" + requiredType.getName());

}

return applicationContext.getBean(names[0]);

}

public static Collection<Object> getBeans(String... names) throws BeansException {

Collection<Object> beans = new ArrayList<Object>();

for (String name : names) {

beans.add(applicationContext.getBean(name));

}

return beans;

}

public static Map<?, ?> getBeans(Class<?> requiredType) throws BeansException {

Map<String, Object> beans = new HashMap<String, Object>();

String[] names = applicationContext.getBeanNamesForType(requiredType);

for (String name : names) {

beans.put(name, applicationContext.getBean(name));

}

return beans;

}

/**

 * 如果BeanFactory包含一個與所給名稱匹配的bean定義,則返回true

 *

 * @param name

 * @return boolean

 */

public static boolean containsBean(String name) {

return applicationContext.containsBean(name);

}

/**

 * 判斷以給定名字註冊的bean定義是一個singleton還是一個prototype。

 * 如果與給定名字相應的bean定義沒有被找到,將會丟擲一個異常(NoSuchBeanDefinitionException)

 *

 * @param name

 * @return boolean

 * @throws NoSuchBeanDefinitionException

 */

public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {

return applicationContext.isSingleton(name);

}

/**

 * @param name

 * @return Class 註冊物件的型別

 * @throws NoSuchBeanDefinitionException

 */

public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {

return applicationContext.getType(name);

}

/**

 * 如果給定的bean名字在bean定義中有別名,則返回這些別名

 *

 * @param name

 * @return

 * @throws NoSuchBeanDefinitionException

 */

public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {

return applicationContext.getAliases(name);

}

}

第二步:spring配置檔案中配置

<!-- 建議第一行,最起碼要在應用的類前面載入 -->

<bean id="springContextUtil" class="com.cn.demo.SpringContextUtil" />

第三步:類中應用的方式

SpringContextUtil.getBean(bean的id);

說明:

到上面可以說是已經結束了,但是,對於一些新手來說,恐怕沒那麼簡單,廢話少說,直接簡單的demo

第一步:建立一個共有父類抽象類,裡面是用到的一些共有方法或者引數

publicabstractclass Demo {

publicvoid demo(){

System.out.println("demo");

}

}

第二步:實際執行的類

Demo1類:

publicclass Demo1extends Demo{

publicvoid demo(){

System.out.println("demo1");

}

}

Demo2類:

publicclass Demo2extends Demo{

publicvoid demo(){

System.out.println("demo2");

}

}

第三步:呼叫者

publicclass Demo3 {

publicvoid test(String beanName){

Demo demo = (Demo)SpringContextUtil.getBean(beanName);

demo.demo();

}

}

第四步:配置檔案(applicationContext-config.xml)

<!-- 建議第一行,最起碼要在應用的類前面載入 -->

<beanid="springContextUtil"class="com.cn.demo.SpringContextUtil"/>

<beanid="demo3"class="com.cn.demo.Demo3"/>

<beanid="demo1"class="com.cn.demo.Demo1"/>

<beanid="demo2"class="com.cn.demo.Demo2"/>

第五步:測試類

publicclass Test {

publicstaticvoid main(String[] args) {

ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:applicationContext-config.xml"});

Demo3 d = (Demo3)appContext.getBean("demo3");

d.test("demo1");

appContext.start();

}

}

說明:

經過上面案例,是不是明白了許多,建議直接複製到測試專案中,或者直接黏貼到專案中,測試下看看就可以了,實際用的話,結合自己的專案需求,入座對號就可以了,原理都是一樣的