java – 为什么Spring的@Configurable有时可以工作,有时不工作?

我试图通过 Spring的@Configurable注释w / @Resource在需要注入的字段上使用自动依赖注入.这涉及到一些设置,如将spring-agent.jar传递给我的JVM.详情 see here.

它主要是工作.当我的Tomcat正在启动时,我看到了AspectJ的初始化消息,我的User对象自动获取FileService引用等.

问题在于有时它不会发生.它似乎是完全随机的有时我启动,依赖关系不会被注入,有时它们是.我以前在@Transactional在我的用户上遇到麻烦,因为它造成了冲突,我相信代理.我使用JPA,所以我的用户标记为@Entity,所以现在我最好的猜测是这是造成冲突.我读过你不能自动代理一个代理.为了抵消冲突,我遵循了一些在线发现的关于排除CGIIB和Hibernate(我的JPA impl)使用的javassist的注释.

线索:

这是全无的.我所有的@Configurable实例都已注入,也没有注册.
>从数据库重新加载(恢复)实体似乎没有帮助;它是工作还是不工作.
>重启Tomcat任何时间也不会修复它.唯一再次出现骰子的事情是重新部署.换句话说,如果我重新部署它可能会工作.

我怎么弄清楚出了什么问题?有人使用@Configurable与JPA?为什么我的dependencyCheck = true当依赖关系未实际注入时抛出错误

实体

@Entity
@Configurable(dependencyCheck = true)
@NamedQueries( { @NamedQuery(name = "User.findAll",query = "SELECT user FROM User user"),@NamedQuery(name = "User.findByEmail",query = "SELECT user FROM User user WHERE user.email = :email") })
public abstract class User extends BaseModel {

private static final long serialVersionUID = 7881431079061750040L;

@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private Long id;

@Column(unique = true,nullable = false)
private String email;

@Basic(optional = false)
private String password;

@Resource
private transient UserEmailer userEmailer;

@Resource
private transient FileService fileService;

...

aop.xml文件

<!DOCTYPE aspectj PUBLIC
    "-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
    <weaver options="-verbose">
        <include within="com.myapp.domain..*" />
        <exclude within="*..*CGLIB*" />
        <exclude within="*..*javassist*" />
    </weaver>
    <aspects>
        <aspect name="org.springframework.beans.factory.aspectj.AbstractInterfaceDrivenDependencyInjectionAspect" />
    </aspects>
</aspectj>

applicationContext.xml中

...

<context:spring-configured />

<context:load-time-weaver />

<context:component-scan base-package="com.myapp" />

...

解决方法

首先我不得不说,将资源,服务或其他bean注入到数据模型类中作为依赖关系可能不是一个好主意.但这是一个设计问题.

对于@Configurable的使用,我在Spring对象从外部实例化的情况下使用它,如Web应用程序,过滤器或servlet中的自定义标签.我试图使用它的第一种方式是按照你的加载时间编织.这很有效,但它有一些缺点,如热代码部署,而调试不再工作.

我也完全体会到你所描述的问题,所以我决定从加载时间编织转换到编译时间.因此,我在Eclipse中安装了AJDT plugin,并使用了Spring的aspecjt支持.这解决了我的问题.

相关文章

ArrayList简介:ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增...
一、进程与线程 进程:是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。 线程...
本文为博客园作者所写:&#160;一寸HUI,个人博客地址:https://www.cnblogs.com/zsql/ 简单的一个类...
#############java面向对象详解#############1、面向对象基本概念2、类与对象3、类和对象的定义格式4、...
一、什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域...
Collection接口 Collection接口 Collection接口 Collection是最基本的集合接口,一个Collection代表一组...