使用spring 自动注入特性的伙计们注意了

lovingprince 2009-01-07 06:02:38
spring中可以只用autowire="byName"或者"byType"来提供自动注入。但是大家有一点还需要注意,那就是它不支持基本数据类型(String,int,long等)的自动注入。例如
JAVA类:

1. public class TestBean {
2. private String name;
3. private Long age;
4. private String fullName;
5. private TestBean2 testBean2;
6.
7. public void setTestBean2(TestBean2 testBean2) {
8. this.testBean2 = testBean2;
9. }
10. public TestBean2 getTestBean2() {
11. return testBean2;
12. }
13. public void setFullName(String fullName) {
14. this.fullName = fullName;
15. }
16. public String getFullName() {
17. return fullName;
18. }
19.
20. public void setAge(Long age) {
21. this.age = age;
22. }
23.
24. public Long getAge() {
25. return age;
26. }
27.
28. public void setName(String name) {
29. this.name = name;
30. }
31.
32. public String getName() {
33. return name;
34. }
35. }
36.

JAVA类2:

1. public class TestBean2 {
2. public String getString(){
3. return "testB";
4. }
5. }

配置文件:

1. <beans default-autowire="byName">
2. <!-- login -->
3. <bean id="testBean" class="TestBean">
4. <property name="fullName">
5. <value>fullName</value>
6. </property>
7. </bean>
8. <bean id="name" class="java.lang.String">
9. <constructor-arg>
10. <value>hell</value>
11. </constructor-arg>
12. </bean>
13. <bean id="age" class="java.lang.Long">
14. <constructor-arg>
15. <value>20</value>
16. </constructor-arg>
17. </bean>
18. <bean id="testBean2" class="TestBean2"/>
19. </beans>

测试类:

1. import org.springframework.context.support.ClassPathXmlApplicationContext;
2.
3. public class Test {
4. public static void main(String[] args) {
5. ClassPathXmlApplicationContext t = new ClassPathXmlApplicationContext(
6. "test.xml");
7. TestBean bean = (TestBean) t.getBean("testBean");
8. System.out.println("name:" + bean.getName() + " age:" + bean.getAge()
9. + " fullName :" + bean.getFullName() + " testBean2"
10. + bean.getTestBean2().getString());
11. }
12.
13. }

输出的结果是:
name:null age:null fullName :fullName testBean2:testB


spring源码中排除基本类型的代码(源码来自:org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory类)在:

1. protected String[] unsatisfiedNonSimpleProperties(AbstractBeanDefinition mbd, BeanWrapper bw) {
2. Set result = new TreeSet();
3. PropertyValues pvs = mbd.getPropertyValues();
4. PropertyDescriptor[] pds = bw.getPropertyDescriptors();
5. for (int i = 0; i < pds.length; i++) {
6. if (pds[i].getWriteMethod() != null && !isExcludedFromDependencyCheck(pds[i]) &&
7. !pvs.contains(pds[i].getName()) && !BeanUtils.isSimpleProperty(pds[i].getPropertyType())) {
8. result.add(pds[i].getName());
9. }
10. }
11. return StringUtils.toStringArray(result);
12. }
13.


请注意以上紫色部分。而这个unsatisfiedNonSimpleProperties方法都是在自动注入时调用。所以基本类型不会被注入。


要看更好格式的朋友直接到偶博客去看吧,这里有点乱感觉 http://blog.csdn.net/lovingprince/archive/2009/01/07/3728345.aspx
...全文
693 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
success000 2009-01-09
  • 打赏
  • 举报
回复
友情up
jcyan 2009-01-09
  • 打赏
  • 举报
回复
好人,谢谢
imasmallbird 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 lovingprince 的帖子:]
spring中可以只用autowire="byName"或者"byType"来提供自动注入。但是大家有一点还需要注意,那就是它不支持基本数据类型(String,int,long等)的自动注入。例如

[/Quote]

学习了~·
不过String与基本类型...

飞过~~
mizukusa 2009-01-08
  • 打赏
  • 举报
回复
哦,谢谢分享
michaelye18 2009-01-07
  • 打赏
  • 举报
回复
学习
酒剑仙 2009-01-07
  • 打赏
  • 举报
回复
学习了
LZ好人

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧