我在项目上工作了几个月甚至没有注意到这一点,昨天,在编辑了一个类文件(用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>
那么,任何人都可以向我解释发生了什么,或者可能是什么原因? 感谢。
答案 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
@Autowired注释以及弹簧bean上的@Component,用于按类型进行自动装配。
@Resource注释,它通过名称+ @Component在您的spring bean中进行自动装配,因为您尚未在spring配置中定义任何bean。你的sping bean会将classname的第一个字母小写。
default-autowire =“bytype”正如@gkamal所讨论的那样。
default-autowire =“byname”+ @Component。
默认自动装配= “自动检测”。
答案 2 :(得分:0)