根据不同属性类型动态获取不同bean
来源:互联网 发布:淘宝店铺类目 编辑:程序博客网 时间:2024/06/03 20:54
第一步: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
第一步:创建一个共有父类抽象类,里面是用到的一些共有方法或者参数
public abstract class Demo {
public void demo(){
System.out.println("demo");
}
}
第二步:实际执行的类
Demo1类:
public class Demo1 extends Demo{
public void demo(){
System.out.println("demo1");
}
}
Demo2类:
public class Demo2 extends Demo{
public void demo(){
System.out.println("demo2");
}
}
第三步:调用者
public class Demo3 {
public void test(String beanName){
Demo demo = (Demo)SpringContextUtil.getBean(beanName);
demo.demo();
}
}
第四步:配置文件(applicationContext-config.xml)
<!-- 建议第一行,最起码要在应用的类前面加载 -->
<bean id="springContextUtil" class="com.cn.demo.SpringContextUtil" />
<bean id="demo3" class="com.cn.demo.Demo3"/>
<bean id="demo1" class="com.cn.demo.Demo1"/>
<bean id="demo2" class="com.cn.demo.Demo2"/>
第五步:测试类
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(new String[]{"classpath*:applicationContext-config.xml"});
Demo3 d = (Demo3)appContext.getBean("demo3");
d.test("demo1");
appContext.start();
}
}
说明:
经过上面案例,是不是明白了许多,建议直接复制到测试项目中,或者直接黏贴到项目中,测试下看看就可以了,实际用的话,结合自己的项目需求,入座对号就可以了,原理都是一样的
- 根据不同属性类型动态获取不同bean
- springboot根据不同的条件创建bean,动态创建bean,@Conditional注解使用
- android根据不同分辨率获取不同分辨率
- 【JSF小记】不同bean中的属性传递
- Java 根据环境属性区分不同操作系统
- SQL:根据消费类型不同统计人次
- Angular根据获取值不同给不同的样式
- Maven根据不同个环境打包, 获取不同的配置文件
- Maven根据不同个环境打包, 获取不同的配置文件
- 根据需要动态include不同的文件
- 根据需要动态include不同的文件
- 根据需要动态include不同的文件
- 根据数据源不同动态加载模板
- maven动态根据环境的不同打包
- .NET 根据下拉列表选择不同的值动态改变对应textbox的属性
- 根据不同的实例自动获取类名和属性(通用显示工具)
- 不同浏览器获取html标签自定义属性
- elasticsearch 的mapping根据不同的数据格式设定属性
- Volley框架使用与源码解析(二)
- 群集环境不需重启,快速收集KSQL、RPC日志的方法
- [LeetCode] 110. Balanced Binary Tree
- centos6.5/centos7安装部署企业内部知识管理社区系统wecenter
- 组合、继承
- 根据不同属性类型动态获取不同bean
- 通用多级下拉,js为主
- spring 日期格式传递
- 寻找二叉树中长度为k的路径(根节点到叶子节点)
- lua中table的基础用法
- 恋城--武汉
- 基础表比商户对账和汇总多了一笔退款数据
- 你会这几项,就会极大的提升Gradle编译速度
- StringBuilder和StringBuffer的区别