我想定义一个没有接口的Spring Bean类

8

我有一个扩展了HibernateDaoSupport的Spring Bean。我想将这个Bean注入到我的控制器中,但是我不想让它实现任何接口。我只想从我的其余代码中引用具体类(也许不使用AopProxy?)有没有人知道如何做到这一点?

<bean id="mySampleService" class="com.sample.MySampleService">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

@Autowired
private MySampleService mySampleService;

... getters and setters ....

我知道使用接口是一个很好的想法,这也是IoC的整个重点,但是请不要建议我使用接口。


目前是什么强制你使用一个接口? - Adam Paynter
很好的观点axtavt(和Adam)- 它会给出java.lang.ClassNotFoundException:MySampleService,但该类绝对存在。只有在我从项目中删除相应的“MySampleInterface”时才开始出现这种情况... - fandang
1
你的 MySampleService 实现了其他接口吗?比如标记接口等。此外,你的 MySampleService 上有 @Transactional 这样的注解吗? - Biju Kunjummen
是的,MySampleService在类级别上有@Transactional(readOnly = false),并且仅实现其超类(HibernateDaoSupport)实现的内容...谢谢! - fandang
此错误也在跟踪中 - org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到匹配的类型为 [com.sample.MySampleService] 的bean,以满足此依赖项:期望至少有一个bean符合此依赖项的自动装配候选项。依赖项注释:{@org.springframework.beans.factory.annotation.Autowired(required = true)}。 - fandang
3个回答

12

如果被代理的类(在您的情况下是事务代理)实现了任何接口(在您的情况下由HibernateDaoSupport实现了InitializingBean接口),那么Spring默认使用基于JDK动态代理的代理策略。

因此,它创建了一个类型为InitializingBean的代理对象,显然不能注入到MySampleService类型的字段中。

如果您不想使用接口,可以通过声明<tx:annotation-driven>并设置proxy-target-class =“true”来重写事务方面使用的策略。

另请参阅:


2
另外,不要将具体类声明为final,否则您将无法以这种方式进行代理。 - Matt
1
axtavt 谢谢,这个方法很有效 :) 现在 bean 已经存在且不为空,正是我想要的结果。我永远也想不到 tx:annotation 属性,所以再次感谢! - fandang
请确保具有空构造函数,就像Alf在这里提到的那样(https://dev59.com/f2ox5IYBdhLWcg3w3YD-) - Glenn Lawrence

0

类路径没问题,因为就像我说的,在移除接口之前一切都正常运作了...没有 cglib 不可能之前能够工作。 - fandang

0
你可以将包括映射控制器在内的所有内容写在xml中作为beans,这样就不需要编写接口了。 否则,使用注解的话,你需要构建接口来代理它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接