没有显式依赖声明的Spring bean注入?

时间:2011-12-22 11:02:21

标签: java spring aop javabeans

我在项目上工作了几个月甚至没有注意到这一点,昨天,在编辑了一个类文件(用getter / setter插入新的依赖bean)之后,我忘了明确添加:

<property name="deviceService" ref="deviceService"/>

在适当的弹簧上下文中xml 我将我的网络应用程序发布到tomcat,进入调试,当我看到使用此服务bean的代码行时,我意识到我忘了将其声明为依赖。
但是,奇怪的事情发生了 - 尽管如此,豆子被注入了...... 这种行为让我感到困惑。我肯定不是春天专家,过去几个月我一直在使用它,但这不是我预期的可能。可以看出,类字段的名称与正在注入的bean相同,如果这很重要的话。在调试器中,我看到了依赖字段的类似内容:

deviceService=$Proxy5 (id=107)
   * h=JdkDynamicAopProxy (id=147)

所以我猜它必须用spring AOP做点什么。

我必须补充说,我没有从头开始这个项目,它已经配置,它使用spring-aop进行事务划分,以及一些日志记录目的。

修改
一些额外的信息:项目也集成了ZK Ajax和Hibernate。这个服务bean基本上是DAO bean的包装器; DAO bean又是spring的HibernateTemplate的包装器。服务和DAO bean是单例范围的。正在注入的服务被注入到原型范围的MVC控制器bean中。 Service bean来自用于DB事务划分的包:

<tx:advice id="serviceTxAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <tx:method name="*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="serviceMethodsRMS"
        expression="execution(* org.irvas.amregina.backend.service.*.*(..))" />
    <aop:advisor advice-ref="serviceTxAdvice" pointcut-ref="serviceMethodsRMS" />
</aop:config>

那么,任何人都可以向我解释发生了什么,或者可能是什么原因? 感谢。

3 个答案:

答案 0 :(得分:2)

在xml的root beans标记上有一个属性 default-autowire-byname / default-autowire-bytype 。如果将其设置为true,则spring将自动注入依赖项。默认情况下,它设置为false - 我猜你在上面的一个标志设置为true。

AOP不参与依赖注入。您正在查看代理,因为正在注入的对象正在使用需要aop的spring的某些功能(如事务,安全性等)。

答案 1 :(得分:1)

在配置中检查以下其中一项。

context:annotation-config或context:component-scan with

  1. @Autowired注释以及弹簧bean上的@Component,用于按类型进行自动装配。

  2. @Resource注释,它通过名称+ @Component在您的spring bean中进行自动装配,因为您尚未在spring配置中定义任何bean。你的sping bean会将classname的第一个字母小写。

  3. default-autowire =“bytype”正如@gkamal所讨论的那样。

  4. default-autowire =“byname”+ @Component。

  5. 默认自动装配= “自动检测”。

答案 2 :(得分:0)