关于Spring注入的问题 spring依赖注入java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 注入 name 是属性名字段,代码只是声明了,没有实例对象,对象由spring产生注入protected ILogRecordService logRecoderService;ILogRecordService tt = new LogRecordServiceImpl();logRecoderService = tt;tt 的名字与logRecoderService 一样吗? name应该写的是你的代码三中的属性名,ref写的应该是你的代码二中的bean id。这两者根本没有什么关系,无所谓一样不一样,只不过你代码二和代码三中写的一样,如果二三中不一样,name也就和ref不一样了。 ref中的值只是一个id或name,Spring容器根据这个值去注入相应的bean那么引用的这个bean你需要定义好,交给Spring,它才能帮你管理(也就是你的代码二)代码二中的id就对应代码一中的ref,只要这两个能配对就OK~ 应该是你自己理解的不对的原因,对于<bean id="logRecordService" class="com.min.archive.framework.log.service.LogRecordServiceImpl" parent="baseService"> <property name="logRecordDao" ref="logRecordDao"/></bean>property中的name要求和你的类里面的创建的对象的名称是一样的,如下name="logRecordDao",这个时候你应该在LogRecordService里面创建了private LogRecordDao logRecordDao,而ref中的值要求的是和你上面创建的bean的Id值是一样的,就像这个ref="logRecordDao",那么你应该创建了类似于<bean id="logRecordDao" class="......" > ........</bean>的bean,只要值是对应的就不会出现问题,之所以大家都写一样,应该是处于简单,不会搞混的原因吧 我的问题就在于,代码一中的name和ref不一样的话,那么在代码三中就会出现null异常。这正是我所疑虑的地方。 可能是我贴了代码没有作详细的说明,让你误解了。代码一是BaseAction在Spring中的配置,代码二是logRecordService在Spring中的配置。代码三是BaseAction中的部分代码。根据这些代码在BaseAction中不能成功注入logRecordService,而如果把代码一中的name和ref改成一样的,再在BaseAction中作相应的更改就可以成功。我不明白是为什么。 代码一中的name指向代码三中的set方法,代码一中的ref则指向代码二中的配置。可是注入不成功。 检查baseAction中是不是有logRecoderService这个属性,有没有加入set方法。 代码1的ref是代码二中的id,代码1中的name是代码3中的setXXX方法 肯定有的。Myeclipse里在配置文件中按Ctrl再点击name就可以直接跳转到那个set方法中了。 各位大神,我知道name和ref可以不同。但是我就是不明白为什么在配置正确的情况下,却不能注入成功。我只是想知道是不是还有某种情况一定要使得name和ref一样才行。 改成一样就可以,改成一样是改成logRecoderService还是logRecordService 只知道setXXX中的XXX=name,id=ref。管你name和ref一样还是不一样,name跟ref长的一样不一样有啥关系。没遇到必须一样的情况 改成一样就可以,改成一样是改成logRecoderService还是logRecordService改成logRecordService,然后在BaseAction中也作相应的更改就可以了。 所以你的意思就是改成logRecoderService报空指针异常吧。你这样操作:1.代码1中ref修改成logRecoderService。2.代码2中id修改成logRecoderService。试试~~ 这样写就是name和ref一样的情况了,肯定是可以的。 到底什么情况,你不是说改成logRecordService就可以,改成logRecorderService报空指针,我现在让你把ref改成logRecorderService,name还是logRecordService,怎么就一样了???你再想想 property 属性中name应该只想的是你程序中的定义的需要注入接口的名称ref是IOC容器中bean的名称 也就是你需要注入对象的在IOC中的ID <bean id="baseAction" class="com.min.archive.base.action.BaseAction"> <property name="logRecoderService" ref="logRecordService" /></bean>这里的ref是你接口的具体实现类name随便你取什么关键有2点1.name取的AAA那么你用的时候 名字就要是AAA 并且要给getset方法2.ref里面的对象不要引用错; 简单省事儿,你可以使用spring的注解来实现自动注入 @Autowired 亲,我知道你的意思了,你是没有理解正确,就引用你说的代码片段吧,property 和ref的名字确实没有关系 ,你只需要进行这几个原则 1.代码一种的 property 的值 必须和 你代码三种的 private ILogRecordService logRecoderService; 中的“logRecoderService” 一样 ,还有一个简单的判断方法,你按着 ctrl 键,同时鼠标点击代码一里面的 property 的值,如果能跳到代码三,证明你就对了。2. 代码一 里面的 ref 的值和代码三没有关系,他值需要和代码二中的 id的值一样就行了。3综上所述,楼上同仁说的都对,是你没搞清楚原理,都写成一样的是因为不懂原理,或者怕写错了,反正都一样了就不容易错了,我感觉,你必须理解原理了才能这么做。 擦,擦,spring ioc 仔细看看 <bean id="logRecordService" class="com.min.archive.framework.log.service.LogRecordServiceImpl" parent="baseService"> <property name="logRecordDao" ref="logRecordDao"/></bean> <property name="logRecordDao" ref="logRecordDao"/>中的name=XX “xx”必须是小写 在3.0中是这样 不知道现在改没改。 Ajax如何接收数组 网页分页问题 薪资管理系统 阿里巴巴的静态页面是如何统计阅读数的? 又来了个问题,睡不着,帮忙啊 在JavaBean中怎样向JSP页面写输出内容? 高分求B/S结构的系统设计样例 javaBean 错误,求救 我想问一下:如何限制float型数据的精确度? 能不能从主键获取外键里面 其他的值 apache mina 或者 netty 与手机端通信。加密方案? 速卖通授权 如何获取的啊?
protected ILogRecordService logRecoderService;
ILogRecordService tt = new LogRecordServiceImpl();
logRecoderService = tt;
tt 的名字与logRecoderService 一样吗?
这两者根本没有什么关系,无所谓一样不一样,只不过你代码二和代码三中写的一样,如果二三中不一样,name也就和ref不一样了。
那么引用的这个bean你需要定义好,交给Spring,它才能帮你管理(也就是你的代码二)
代码二中的id就对应代码一中的ref,只要这两个能配对就OK~
<bean id="logRecordService" class="com.min.archive.framework.log.service.LogRecordServiceImpl" parent="baseService">
<property name="logRecordDao" ref="logRecordDao"/>
</bean>
property中的name要求和你的类里面的创建的对象的名称是一样的,如下name="logRecordDao",这个时候你应该在LogRecordService里面创建了private LogRecordDao logRecordDao,而ref中的值要求的是和你上面创建的bean的Id值是一样的,就像这个ref="logRecordDao",那么你应该创建了类似于<bean id="logRecordDao" class="......" >
........
</bean>的bean,只要值是对应的就不会出现问题,之所以大家都写一样,应该是处于简单,不会搞混的原因吧
代码一是BaseAction在Spring中的配置,代码二是logRecordService在Spring中的配置。代码三是BaseAction中的部分代码。
根据这些代码在BaseAction中不能成功注入logRecordService,而如果把代码一中的name和ref改成一样的,再在BaseAction中作相应的更改就可以成功。我不明白是为什么。
改成一样就可以,改成一样是改成logRecoderService还是logRecordService
改成一样就可以,改成一样是改成logRecoderService还是logRecordService
改成logRecordService,然后在BaseAction中也作相应的更改就可以了。
你这样操作:
1.代码1中ref修改成logRecoderService。
2.代码2中id修改成logRecoderService。
试试~~
ref是IOC容器中bean的名称 也就是你需要注入对象的在IOC中的ID
<property name="logRecoderService" ref="logRecordService" />
</bean>这里的ref是你接口的具体实现类
name随便你取什么
关键有2点
1.name取的AAA那么你用的时候 名字就要是AAA 并且要给getset方法
2.ref里面的对象不要引用错;
1.代码一种的 property 的值 必须和 你代码三种的 private ILogRecordService logRecoderService; 中的“logRecoderService” 一样 ,还有一个简单的判断方法,你按着 ctrl 键,同时鼠标点击代码一里面的 property 的值,如果能跳到代码三,证明你就对了。2. 代码一 里面的 ref 的值和代码三没有关系,他值需要和代码二中的 id的值一样就行了。3综上所述,楼上同仁说的都对,是你没搞清楚原理,都写成一样的是因为不懂原理,或者怕写错了,反正都一样了就不容易错了,我感觉,你必须理解原理了才能这么做。
<bean id="logRecordService" class="com.min.archive.framework.log.service.LogRecordServiceImpl" parent="baseService">
<property name="logRecordDao" ref="logRecordDao"/>
</bean>
<property name="logRecordDao" ref="logRecordDao"/>中的name=XX “xx”必须是小写 在3.0中是这样 不知道现在改没改。