Panda.Ioc - 你都可以注入什么
从哪里注入?
你可以向对象注入值的位置有两个
- 构造函数参数
- 属性
向构造函数里注入参数
你的 JSON 配置文件会是这样:
{
tom : {
type : 'panda.demo.ioc.json.Pet',
args : ['Tom']
}
}
args的值是一个数组,里面每一个元素都将对应构造函数的一个参数。 当然,你必须确保你得有这样的构造函数。
向属性注入参数
你的 JSON 配置文件会是这样:
{
tom : {
type : 'panda.demo.ioc.json.Pet',
fields : {
name : 'Tom'
}
}
}
如果你不需要写 type,那么你可以用简写模式:
{
tom: { name: 'Tom' }
}
值可以不仅仅是字符串,它还可以是以下类型。
布尔
{
tom : { dead: true }
}
数字
{
tom : { age: 24 }
}
匿名对象
{
tom : {
friend: {
type : 'panda.demo.ioc.json.Pet',
fields : { name : 'Jerry' }
}
}
}
关于匿名对象,请看这里。
引用
{
tom : { friend: '#jerry' }
}
friend: ‘#jerry’ 将会得到容器中另外一个名为jerry的对象
容器自身
{
tom : { myIoc : '#$Ioc' }
}
一种特殊的引用,大小写不敏感,值就是 Ioc 容器本身
对象的名称
{
tom : { beanName : '#$Name'}
}
一种特殊的引用,大小写不敏感,值就是对象的名称,即 “tom”
容器上下文
{
tom : { myContext : '#$Ctx' }
}
一种特殊的引用,大小写不敏感,值就是当前容器的上下文环境接口 panda.ioc.IocContext
JSON 对象/数组
如果你对象某个字段是数组,集合,或者Map, 用JSON可以很自然为其设置值,不是吗?
{
tom : { favorites: [ 'banana', 'bug' ] }
}
或者
{
tom : { favorites: "![ 'banana', 'bug' ]" }
}
EL表达式
这是个极度灵活的注入方式,它几乎可以让你做任何事情。 因为它允许你直接调用一个 JAVA 函数。
更详细的说明,请参看 EL表达式。
下面只是列出主要的几种应用方式
静态属性
{
tom : { staticField : "${'com.my.SomeClass'@staticPropertyName}" }
}
静态函数
{
tom : { staticField : "${'com.my.SomeClass'@staticFunc()}" }
}
带参数的静态函数(参数可以是任何种类的值)
{
tom : { staticField : "${'com.my.SomeClass'@staticFunc('param', true)}" }
}
容器中的对象
{
tom : { friend: '${jerry}' },
jerry : { type : 'com.my.Pet' }
}
容器对象某个属性
{
tom : { oneField : '${jerry.name}' } ,
jerry : { type: 'com.my.Pet'}
}
容器对象某个方法的返回值
{
tom : { oneField : '${jerry.getXXX()}' } ,
jerry : { type: 'com.my.Pet'}
}
容器对象某个方法的返回值,带参数(参数可以是任何种类的值)
{
tom : { oneField : '${jerry.getXXX("some string", true, 34)}' } ,
jerry : { type: 'com.my.Pet'}
}