Spring的属性注入之命名:p注入方式
1.先在命名空间上引入:p
xmlns:p="http://www.springframework.org/schema/p"
2.这样property标签就可以合并入bean标签里面了,比如:
<bean id="mep" class="com.test.inject.Me" p:name="abc" p:age="123"/>
3需要注意的是,这种类必须要有默认的构造方法,否则会导致spring报错说没有默认的构造方法。
nested exception is java.lang.NoSuchMethodException: com.mc.base.learn.spring.bean.Person.<init>()
因为
SpringContext利用无参的构造函数创建一个对象,然后利用setter方法赋值。所以如果无参构造函数不存在,Spring上下文创建对象的时候便会报错。
像property标签和:p标签这样的注入方式都是用setter默认配合无参构造方法进行的
而使用constructor-arg这种可以没有默认的构造方法,而是自己定义的构造方法进行注入参数的
4.p:name=""这种只适用于简单类型的属性注入
如果只复杂类的话,要用p:属性名-ref="该属性在spring中定义的bean id"
比如下面这样的就用到了p:来注入某个产品的分类信息。
<bean id="categroy" class="com.test.inject.Category" p:cateName="服装"></bean>
<bean id="calculate" class="com.test.inject.PriceCalculate"></bean>
<bean id="product" class="com.test.inject.Product" p:name="A21的T恤" p:categroy-ref="categroy">
<property name="price" value="#{calculate.calPrice()}"/>
</bean>