Skip to main content

Inside Spring Framework from Source Code (3)

In the previous post, we just go through how code step to step and starting load spring beans.
For different node type, the related loading code are different.

BEAN_ELEMENT: ParseBeanDefinition
Example of xml



BeanDefinitionParserDelegate.parseBeanDefinitionElement

The second parameter containingBean is used to parse a value, ref or collection sub-element of a property or constructor-arg element. Here we just parse the regular bean, just leave the value as null.

Firstly, the attribute “id” and “name” are retrieved from <bean/>. The name is used for alias purpose. The value could be “name1,name2;name3” with dilimiters {,;}


If there is Id assigned, the first name will used as bean id and the left be used as aliases.

Once the id and name are done, parseBeanDefinitionElement
A bean Definition is returned and add the bean name to bean definition holder.
We will go over all the logic later to see how will generate the bean name automatically when bean name is empty from xml file since most of time we will definitely define the bean id or name in spring xml configuration.
Now, just dig into parseBeanDefinitionElement (passing the bean name)
The code get the “parent” and “className” from xml.
See example about to how to parent xml attribute: by using parent attribute. The child bean inherits message2 property as is, and overrides message1 property and introduces one more property message

Create and set Bean Definition with parent and then override with new child properties.

autowire-candidate??
Parse Bean attribute:
1. scope
2. abstract
3. lazy-init
4. Autowire
5. Depends-on
6. Autowire-candiate
7. primary
8. init-method
9. destroy-method
10. Factory-method
11. factory-bean


parse Meta Elements
1. meta
2. Source of meta attribute
parseLookupOverrideSubElements
1. lookup-method: name, bean
parseReplacedMethodSubElements
1. replace-method: name, replace, arg-type, match
parseConstructorArgElements
1. constructor-arg: index, type, name, ref, value
2. parsePropertySubElement :support more value def (bean, ref, idref, value, null, array, list, set, props,)
parsePropertyElements
1. property
parseQualifierElements
1. qualifier:The bean with qualifier value "main" is wired with the constructor argument that is qualified with the same value.

Generate Bean Name: BeanDefinitionReaderUtils.generateBeanName
No Bean Class name:
   Has parent: {parent name}$child
   Factory bean name: {factory bean name}$created
Has bean class name:  use given class name
After than, appending the hex string for inner bean ({bean name}#hexcode) or add the index for unique bean name ({beanName}#1)

 

Comments

Popular posts from this blog

How to fix "ValueError when trying to compile python module with VC Express"

When I tried to compile the python, I always get compile issue as following: ------------ ... File "C:\Python26\lib\ distutils\msvc9compiler.py ", line 358, in initialize vc_env = query_vcvarsall(VERSION, plat_spec) File "C:\Python26\lib\ distutils\msvc9compiler.py ", line 274, in query_vcvarsall raise ValueError(str(list(result.keys()))) ValueError: [u'path'] --------------------- Python community discussed a lot but no solution: http://bugs.python.org/issue7511 The root cause is because the latest visual studio change the *.bat file a lot especially on 64bit env. The python 2.7 didn't update the path accordingly. Based on the assumption above, the following solution worked for me. To install Visual Studio 2008 Express Edition with all required components: 1. Install Microsoft Visual Studio 2008 Express Edition. The main Visual Studio 2008 Express installer is available from (the C++ installer name is vcsetup.exe): https://ww

How to convert the ResultSet to Stream

Java 8 provided the Stream family and easy operation of it. The way of pipeline usage made the code clear and smart. However, ResultSet is still go with very legacy way to process. Per actual ResultSet usage, it is really helpful if converted as Stream. Here is the simple usage of above: StreamUtils.uncheckedConsumer is required to convert the the SQLException to runtimeException to make the Lamda clear.

How to run odoo(openerp8) in IDE from source on windows

1. install python 2.7 (per openerp8's official doc, python 27 is required.) 2. download get-pip.py from https://bootstrap.pypa.io/get-pip.py , execute the command: python get-pip.py 3. get source of openerp8 from https://github.com/odoo/odoo.git 4. execute the command: pip install -r D:\source_code\odoo\openerp8/requirements.txt . (requirements.txt contains all dependencies. ) The pip will install the python module automatically. However, the real world always bring us the issues because our C++ compile environment is not setup correctly.  we will get the link error when pip try to install psycopg2 (driver to access postgresql db.). Go to  http://www.stickpeople.com/projects/python/win-psycopg/  and choose the compiled binary file directly. For Python-ldap, go to  http://www.lfd.uci.edu/~gohlke/pythonlibs/ 5. Finally, go to http://sourceforge.net/projects/pywin32/files/pywin32 and choose correct version for python-win32service. 6. If you are family with eclipse a lot,