精华内容
下载资源
问答
  • org.springframework.cglib.beans.BeanMap可以快捷、优雅的将Java entity bean 转换为Map对象;但是使用时也需要主要,org.springframework.cglib.beans.BeanMap直接转换出来的Map对象,做不了put操作;例如: ...

    org.springframework.cglib.beans.BeanMap可以快捷、优雅的将Java entity bean 转换为Map对象;但是使用时也需要主要,org.springframework.cglib.beans.BeanMap直接转换出来的Map对象,做不了put操作;例如:

    LoggerIndex index = new LoggerIndex();
    index.setLoggerTableName("teset1");
    index.setLoggerIndexId(UUID.randomUUID().toString());
    index.setLoggerTableName("tablename");
    index.setLoggerBusSysCode("am");
    
    Map map = BeanMap.create(index);
    
    map.put("test1", "test1");
    
    System.out.println(map.toString());

    map.put("test1", "test1");并没有生效,打印出来的数据没有test1的数据;打印的接口如下:

    {loggerSubTableTime=null, loggerSubTableName=null, loggerSubTableType=null, loggerBusSysCode=am, loggerTableName=tablename, loggerIndexId=dbc7d710-3a95-43c4-8013-0bed26be27a3}

     

    再看下面的处理:

    LoggerIndex index = new LoggerIndex();
    index.setLoggerTableName("teset1");
    index.setLoggerIndexId(UUID.randomUUID().toString());
    index.setLoggerTableName("tablename");
    index.setLoggerBusSysCode("am");
    
    Map map = BeanMap.create(index);
    
    Map resMap = new HashMap();
    resMap.putAll(map);
    
    resMap.put("test1", "test1");
    
    System.out.println(resMap.toString());

    重新定义一个HashMap将转换出来的map,putAll进去定义的HashMap(resMap );对resMap 进行put操作;打印结果如下:

    {loggerSubTableTime=null, loggerSubTableName=null, loggerSubTableType=null, loggerBusSysCode=am, loggerTableName=tablename, loggerIndexId=25a46e5a-a349-4e98-9e09-46851d3f1219, test1=test1}

     

    此时test1的数据正常打印出来。

     

     

    展开全文
  • spring bean map的定义

    千次阅读 2010-09-15 09:22:00
    般我们知道在property属性里面定义一个无id的map是比较容易的, 但是如何将map定义一个单独的bean, 以便重用, google了一下, 这里给出了说明, 不过有些问题, 没有value那个节点, 不知道是否spring版本的问题, ...

    般我们知道在property属性里面定义一个无id的map是比较容易的, 但是如何将map定义一个单独的bean, 以便重用, google了一下, 这里给出了说明, 不过有些问题, 没有value那个节点, 不知道是否spring版本的问题, 修改之后, 备注一下.

    Xml代码 复制代码
    1. <bean id="SymbolMap" class="java.util.HashMap">  
    2.     <constructor-arg>  
    3.        <map>  
    4.          <entry>  
    5.             <key><value><![CDATA[us;djia]]></value></key>  
    6.             <value><![CDATA[us&dji]]></value>  
    7.          </entry>  
    8.        </map>  
    9.     </constructor-arg>  
    10. </bean>  


    还用另外一种形式:

    Xml代码 复制代码
    1. <bean id="emails" class="org.springframework.beans.factory.config.MapFactoryBean">  
    2.   <property name="sourceMap">  
    3.       <map>  
    4.         <entry key="pechorin" value="pechorin@hero.org"/>  
    5.         <entry key="raskolnikov" value="raskolnikov@slums.org"/>  
    6.         <entry key="stavrogin" value="stavrogin@gov.org"/>  
    7.         <entry key="porfiry" value="porfiry@gov.org"/>  
    8.       </map>  
    9.   </property>  
    10. </bean>  
    展开全文
  • 我宁愿靠自己的力量,打开我的前途,而不...xml中通过bean节点来配置; 使用@Service、@Controller、@Conponent等注解。 最近在研究通过Spring初始化时扫描自定义注解,查到了通过实现BeanDefinitionRegistryPostP...

    我宁愿靠自己的力量,打开我的前途,而不愿求有力者垂青。——《悲惨世界》

    1、理论

    一般如果想将类注册到spring容器,让spring来完成实例化,常用方式如下:

    1. xml中通过bean节点来配置;
    2. 使用@Service、@Controller、@Conponent等注解。

    最近在研究通过Spring初始化时扫描自定义注解,查到了通过实现BeanDefinitionRegistryPostProcessor获取Bean,从而获得自定义注解。

    Spring支持我们通过代码来将指定的类注册到spring容器中。

    在这里插入图片描述

    Spring容器初始化时,从资源中读取到bean的相关定义后,保存在BeanDefinitionMap,在实例化bean的操作就是依据这些bean的定义来做的,而在实例化之前,Spring允许我们通过自定义扩展来改变bean的定义,定义一旦变了,后面的实例也就变了,而beanFactory后置处理器,即BeanFactoryPostProcessor就是用来改变bean定义的。
    在这里插入图片描述
    通过invokeBeanFactoryPostProcessors方法用来找出所有beanFactory后置处理器,并且调用这些处理器来改变bean的定义。

    BeanDefinitionRegistryPostProcessor继承了BeanFactoryPostProcessor接口,BeanFactoryPostProcessor的实现类在其postProcessBeanFactory方法被调用时,可以对bean的定义进行控制,因此BeanDefinitionRegistryPostProcessor的实现类一共要实现以下两个方法:

    1. void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException:
      该方法的实现中,主要用来对bean定义做一些改变。

    2. void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException:
      该方法用来注册更多的bean到spring容器中,详细观察入参BeanDefinitionRegistry接口,看看这个参数能带给我们什么能力。

    在这里插入图片描述
    从BeanDefinitionRegistry可以看到,BeanDefinitionRegistry提供了丰富的方法来操作BeanDefinition,判断、注册、移除等方法都准备好了,我们在编写postProcessBeanDefinitionRegistry方法的内容时,就能直接使用入参registry的这些方法来完成判断和注册、移除等操作。

    org.springframework.context.support.AbstractApplicationContext#refresh中的invokeBeanFactoryPostProcessors(beanFactory);用来找出所有beanFactory后置处理器,并且调用这些处理器来改变bean的定义。

    invokeBeanFactoryPostProcessors(beanFactory)实际上是委托org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());方法处理的。

    在这里插入图片描述

    首先处理BeanFactoryPostProcessor中的内容:
    在这里插入图片描述

    所有实现了BeanDefinitionRegistryPostProcessor接口的bean,其postProcessBeanDefinitionRegistry方法都会调用,然后再调用其postProcessBeanFactory方法,这样一来,我们如果自定义了BeanDefinitionRegistryPostProcessor接口的实现类,那么我们开发的postProcessBeanDefinitionRegistry和postProcessBeanFactory方法都会被执行一次;

    boolean reiterate = true;
    while (reiterate) {
        reiterate = false;
        //查出所有实现了BeanDefinitionRegistryPostProcessor接口的bean名称
        postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
        for (String ppName : postProcessorNames) {
            //前面的逻辑中,已经对实现了PriorityOrdered和Ordered的bean都处理过了,因此通过processedBeans过滤,processedBeans中没有的才会在此处理
            if (!processedBeans.contains(ppName)) {
                //根据名称和类型获取bean
                BeanDefinitionRegistryPostProcessor pp = beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class);
                //把已经调用过postProcessBeanDefinitionRegistry方法的bean全部放在registryPostProcessors中
                registryPostProcessors.add(pp);
                //把已经调用过postProcessBeanDefinitionRegistry方法的bean的名称全部放在processedBeans中
                processedBeans.add(ppName);
                //执行此bean的postProcessBeanDefinitionRegistry方法
                pp.postProcessBeanDefinitionRegistry(registry);
                //改变退出while的条件
                reiterate = true;
            }
        }
    }
    /registryPostProcessors中保存了所有执行过postProcessBeanDefinitionRegistry方法的bean,
    //现在再来执行这些bean的postProcessBeanFactory方法
    invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
    //regularPostProcessors中保存的是所有入参中带来的BeanFactoryPostProcessor实现类,并且这里面已经剔除了BeanDefinitionRegistryPostProcessor的实现类,现在要让这些bean执行postProcessBeanFactory方法
    

    2、实战代码

    public class AnnotationScannerConfigurer implements BeanDefinitionRegistryPostProcessor {
    
    	@Override
    	public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) throws BeansException {
    		// 创建一个bean的定义类的对象
    		RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(TestServiceImpl.class);
    		// 将Bean 的定义注册到Spring环境
    		beanDefinitionRegistry.registerBeanDefinition("testService", rootBeanDefinition);
    	}
    	
    	@Override
    	public void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {
    	  // bean的名字为key, bean的实例为value
    		Map<String, Object> beanMap = configurableListableBeanFactory.getBeansWithAnnotation(AutoDiscoverClass.class);
    		}
    

    其实在实际使用过程中,Spring启动时扫描自定义注解,是通过BeanFactoryPostProcessor接口的postProcessBeanFactory方法,configurableListableBeanFactory.getBeansWithAnnotation(AutoDiscoverClass.class);获取每一个有自定义注解的Bean。这种方法没满足我的实际需求。

    总结下,BeanFactoryPostProcessor可以修改各个注册的Bean,BeanDefinitionRegistryPostProcessor可以动态将Bean注册。

    展开全文
  • Bean2Map Map2Bean

    千次阅读 2018-01-22 20:10:13
    import org.springframework.cglib.beans.BeanMap Map example = BeanMap.create(bean); ###### Map转Bean import org.apache.commons.beanutils.BeanUtils; public static T> T toBean(Cla


    ###### BeanMap

    import org.springframework.cglib.beans.BeanMap
    Map<String, Object> example = BeanMap.create(bean);
     
    
    ###### Map转Bean
    import org.apache.commons.beanutils.BeanUtils;
    public static <T> T toBean(Class<T> clazz, Map<String, Object> map) {
        if(clazz == Map.class){
            return (T)map;
        }
        try {
            T bean = clazz.newInstance();
            BeanUtils.populate(bean, map);
            return bean;
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
        return null;
    }

     
    

    Map转Bean
    展开全文
  • Spring 注入 Bean 到 List / Map

    千次阅读 2020-01-15 01:12:50
    将注入的Bean 放在List或者Map中: /* * spring会自动将 DemoService 的所有实现类bean注入到list集合 */ @Autowired ... * 通过Map注入,通过 spring bean 的名称作为key动态获取对应实例 */ @Aut...
  • 利用BeanMap进行对象与Map的相互转换

    万次阅读 2019-06-11 10:34:41
    1、通过ObjectMapper先将bean转换为json,再将json转换为map,但是这种方法比较绕,且效率很低,经测试,循环转换10000个bean,就需要12秒!!!不推荐使用 2、通过Java反射,获取bean类的属性和值,再转换到map...
  • 手工添加beanspring容器

    千次阅读 2018-01-30 10:35:23
    @Configuration @ConditionalOnClass(DefaultMQPushConsumer.class) @EnableConfigurationProperties(RocketMQProperties.class) @ConditionalOnProperty(prefix = "spring.rocketmq", value = "nameServer") @Order
  • 趁着金九跳槽季,跳槽成功了。从之前的老东家跳入很老的大厂,也算完成了自己的大场梦。按照自己迂腐思想,两三年内应该不会跳槽了。... 刚工作之初读过Spring源码,因能力有限根本没有理解多少,...
  • 下面要给大家讲一个关于mapbean的故事。。。 ------------------------------------------------ 前戏: 还记得很久以前,我在上学的时候,老师教我们什么叫数据库,什么叫SQL,怎么使用JDBC去连接数据库,然后...
  • Spring 手动注册bean

    千次阅读 2020-05-02 22:31:14
    一般情况下,我们Spring应用中的bean都是通过注解或者xml注入到容器中的,有些情况下我们可能想手动往容器中注入bean,即编程方式注入... Spring 中用BeanDefinition接口描述一个beanSpring容器中用Map<Strin...
  • 1.lib必须按照项目中的classpath中的顺序 不然 系统找不到类 2.框架能够自动生成类和dao层 3.框架集成了Spring 能够自动将bean、dao、service装载到SPring容器中,供调用
  • cglib中的两个工具类BeanMap,BeanCopier

    千次阅读 2015-01-25 17:11:38
    这两天看了下cglib的一些源码,发现BeanMap和BeanCopier在工作中应该可以用到,虽然已经apache和spring的相关工具类可以用了,但是多一个工具类也不嫌多嘛,况且BeanCopier的速度会更快一些。  1.BeanMap本身是...
  • Spring Bean详细讲解 什么是Bean?

    万次阅读 多人点赞 2018-11-19 15:45:37
    Spring Bean是被实例的,组装的及被Spring 容器管理的Java对象。 Spring 容器会自动完成@bean对象的实例化。 创建应用对象之间的协作关系的行为称为:装配(wiring),这就是依赖注入的本质。 Spring 三种配置方案 ...
  • org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping': Invocation of init method f
  • BeanCopier是Cglib包中的一个类,用于对象与Map之间相互转换。 实体类 package com.hanyong.domain; import lombok.Data; /** * SysUserDO * * @Author: han * @CreateTime: 2019-05-28 */ @Data public...
  • java工具类-beanmap

    千次阅读 2020-06-22 21:46:56
    工作常常遇到将java的Bean对象转化为Map,或者将Map转为Bean对象。 常见的手段 通过json工具,将Bean转json,再将json转Map 效率低 jdk的反射,获取类的属性,进行转化 ...循环转化1w次,对比下BeanMap
  • 实现EnvironmentAware 接口可以取得properties里的配置文件(原来打算使用一个config类取,然后从注入Config取值,行不通的原因是@value 是在bean实例化后才注入进去的,这个我通过applicationaware取得的bean里面的...
  • Spring的《XML显式装配bean》- 注入Map

    千次阅读 2017-01-22 13:04:47
    这一篇blog主要是介绍向bean中注入map类型的属性 (1)entity 烤炉类:基本没有变化package spring.ch1.topic12;/** * Created by louyuting on 17/1/21 * 烤炉类 */ public class Oven { private String name ...
  • 如何向一个bean注入List和Map
  • map类型的: &amp;lt;!-- 旧版方式,无需util包 --&amp;gt; &amp;lt;bean id=&quot;emails&quot; class=&quot;org.springframework.beans.factory.config.MapFactoryBean&quot;&
  • 前几天遇到两个比较可笑的问题,现在总结起来,还觉得比较滑稽,一个是map.get(0),另一个是spring在构造bean时在构造方法里面引用别的bean的问题。  首先map.get(0)的问题应该是用惯了list的get方法。看例子 @...
  • 以前也学习过Spring框架,不过好久没用,当时学完也没做什么总结,都忘的差不多了,今天再从头开始学习一遍。...第一天:Spring的概述、SpringIOC入门(XML)、SpringBean管理、Spring属性注入 第...
  • 异常如下nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [java.lang.String] found for dependency [map with value type java.lang.String]: ...
  • Spring XML配置<Map>注入Bean属性举例

    万次阅读 2012-07-04 14:03:13
    Spring 元素用来存储多个键值对属性,类型为java.util.Map;他的子标签用来定义Map中的键值实体,下面举例说明; Article.java 这个article class有一个属性是作者联名信息,使用序号和作者名来构成一个Map属性...
  • Spring json和 Map, List等bean的转换

    千次阅读 2017-04-22 21:28:03
    1: 将map集合转换成json字符串和将json字符串转换成map 1. [代码][Java]代码  1 2 3 4 5 6 Map map = new HashMap(); map.put("method","json"); map.put("param",nu
  • 使用@Value注入map、List 实体类 List: @Value("${test.list.ids:1,2,3}") private List<String> testList; 或者 @Value("${test.list.ids:1,2,3}") private String[] testList; List 指定分隔...
  • spring bean加载原理

    千次阅读 2018-01-05 22:15:21
    简单的分析了一下spring bean的加载原理,属于个人的理解,源码比这个要复杂的多: spring的配置文件applicationContext.xml的内容如下: beans> bean id="userDao" class=...
  • 搭建完spring boot的demo后自然要实现自动注入来体现spring ioc的便利了,但是我在实施过程中出现了这么一个问题,见下面,这里找到解决办法记录下来,供遇到同样的问题的同僚参考  Description:Field ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 184,658
精华内容 73,863
关键字:

beanmapspring

spring 订阅