Spring管理事物持有者Service时注入方式和普通类不一样吗?

时间:2021-08-08 14:40:22
最近在做一个项目的时候,发现了一个很奇怪的问题:
如果我直接在SPring-bean.xml里面配置beans如下:

<bean id="abcService" class="sdb.service.impl.AbcServiceImpl">
</bean>
<bean id="abcAction" class="sdb.action.AbcAction">
     <property name="abcService" >
        <ref bean="abcService"/>
    </property>
</beans>
在AbcAction中的定义 如下:

private  AbcServiceImpl abcService;
public void setAbcService(AbcServiceImpl abcService){
    this.abcService=abcService;
}

则运行没有任何问题。但是如果我将事物配置给Service层,
<value>*Service</value>
则启动报错。报错内容: no matching editors or conversion strategy found。
必须把action中的定义改为接口才行,这个是合理的。
但是之前我没有将service配置为事物的时候,Spring为什么不报错?我没有改过注入规则,默认可以进行实体类注入吗?
另外。如果可以进行实体类注入的话,为什么将事物配置在service层的时候就会报错了?是事物的所有者必须使用接口注入吗?

6 个解决方案

#1


是滴  spring 的service层添加事务管理时必须是接口

#2


spring的di是面向接口的。不管是service还是dao。
这个是根据设计模式中的依赖倒置原则和里氏替换原则。

#3


引用 1 楼 yangcl123 的回复:
是滴  spring 的service层添加事务管理时必须是接口

哦,明白了。那为什么Service持有事物的时候就必须是接口呢?是会在Service层再加一个代理什么的,我可以这样理解吗?

#4


引用 2 楼 my_God_sky 的回复:
spring的di是面向接口的。不管是service还是dao。
这个是根据设计模式中的依赖倒置原则和里氏替换原则。


可是在不给Service层配置事物管理的时候,后台声明用实现类进行声明是没有问题的啊,为什么呢?

#5


引用 4 楼 shuaijingxin 的回复:
Quote: 引用 2 楼 my_God_sky 的回复:

spring的di是面向接口的。不管是service还是dao。
这个是根据设计模式中的依赖倒置原则和里氏替换原则。


可是在不给Service层配置事物管理的时候,后台声明用实现类进行声明是没有问题的啊,为什么呢?

声明实现是自己找到对象实例。而注解是spring找到实现类帮你实例。你既然用spring管理类就要跟着spring的规则来。

#6


引用 5 楼 my_God_sky 的回复:
Quote: 引用 4 楼 shuaijingxin 的回复:

Quote: 引用 2 楼 my_God_sky 的回复:

spring的di是面向接口的。不管是service还是dao。
这个是根据设计模式中的依赖倒置原则和里氏替换原则。


可是在不给Service层配置事物管理的时候,后台声明用实现类进行声明是没有问题的啊,为什么呢?

声明实现是自己找到对象实例。而注解是spring找到实现类帮你实例。你既然用spring管理类就要跟着spring的规则来。

哦,你这么说我就明白了。非常感谢

#1


是滴  spring 的service层添加事务管理时必须是接口

#2


spring的di是面向接口的。不管是service还是dao。
这个是根据设计模式中的依赖倒置原则和里氏替换原则。

#3


引用 1 楼 yangcl123 的回复:
是滴  spring 的service层添加事务管理时必须是接口

哦,明白了。那为什么Service持有事物的时候就必须是接口呢?是会在Service层再加一个代理什么的,我可以这样理解吗?

#4


引用 2 楼 my_God_sky 的回复:
spring的di是面向接口的。不管是service还是dao。
这个是根据设计模式中的依赖倒置原则和里氏替换原则。


可是在不给Service层配置事物管理的时候,后台声明用实现类进行声明是没有问题的啊,为什么呢?

#5


引用 4 楼 shuaijingxin 的回复:
Quote: 引用 2 楼 my_God_sky 的回复:

spring的di是面向接口的。不管是service还是dao。
这个是根据设计模式中的依赖倒置原则和里氏替换原则。


可是在不给Service层配置事物管理的时候,后台声明用实现类进行声明是没有问题的啊,为什么呢?

声明实现是自己找到对象实例。而注解是spring找到实现类帮你实例。你既然用spring管理类就要跟着spring的规则来。

#6


引用 5 楼 my_God_sky 的回复:
Quote: 引用 4 楼 shuaijingxin 的回复:

Quote: 引用 2 楼 my_God_sky 的回复:

spring的di是面向接口的。不管是service还是dao。
这个是根据设计模式中的依赖倒置原则和里氏替换原则。


可是在不给Service层配置事物管理的时候,后台声明用实现类进行声明是没有问题的啊,为什么呢?

声明实现是自己找到对象实例。而注解是spring找到实现类帮你实例。你既然用spring管理类就要跟着spring的规则来。

哦,你这么说我就明白了。非常感谢