【问题标题】:I want to define a Spring Bean CLASS with NO Interface我想定义一个没有接口的 Spring Bean CLASS
【发布时间】:2012-07-17 17:51:14
【问题描述】:

我有一个扩展 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 的重点,但请不要建议我使用界面。

【问题讨论】:

  • 目前是什么迫使您使用界面?
  • 好点 axtavt(和 Adam)——它给出了 java.lang.ClassNotFoundException: MySampleService,但该类绝对存在。当我从我的项目中删除相应的“MySampleInterface”时,它才开始提供......
  • 您的 MySampleService 是否实现了任何其他接口 - 任何标记接口等?另外,您在 MySampleService 上有没有像 @Transactional 这样的注解?
  • 是的 MySampleService 在类级别有 @Transactional(readOnly = false),并且只实现了它的超类 (HibernateDaoSupport) 实现的东西......谢谢!
  • 这个错误也在跟踪中 - org.springframework.beans.factory.NoSuchBeanDefinitionException: 没有为依赖找到类型为 [com.sample.MySampleService] 的匹配 bean: 预计至少有 1 个符合条件的 bean此依赖项的自动装配候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}

标签: java spring ioc-container


【解决方案1】:

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

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

如果您不想使用接口,您可以通过将&lt;tx:annotation-driven&gt; 声明为proxy-target-class = "true" 来覆盖事务方面使用的策略。

另请参阅:

【讨论】:

  • 另外,不要将具体类设为 final,否则您将无法以这种方式代理它。
  • axtavt 谢谢,这有效:) bean 现在在那里,而不是 null,正是我想要的,永远不会想出 tx:annotation 属性,所以再次感谢!
  • 并确保它具有 Alf here 提到的空构造函数
【解决方案2】:

【讨论】:

  • 类路径很好,因为就像我说的那样,在删除接口之前它都可以正常工作....之前没有 cglib 就无法正常工作....
【解决方案3】:

您可以将 xml 中包括映射控制器在内的所有内容编写为 bean,然后您无需编写接口。 否则,使用注解需要构建接口来代理它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多