gpt4 book ai didi

java - 为什么 Spring 的 @Configurable 有时有效,有时无效?

转载 作者:IT老高 更新时间:2023-10-28 13:50:02 24 4
gpt4 key购买 nike

我正在尝试通过 Spring 的 @Configurable 注释和 @Resource 在需要注入(inject)的字段上使用自动依赖注入(inject)。这涉及一些设置,例如将 spring-agent.jar 传递给我的 JVM。详情 see here .

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

问题是有时它不会发生。它似乎是完全随机的;有时我启动并且没有注入(inject)依赖项,有时它们是。我以前在我的用户上使用@Transactional 时遇到了麻烦,因为它造成了冲突,我相信代理。我正在使用 JPA,所以我的用户用 @Entity 标记,所以我现在最好的猜测是这会造成冲突。我读过你不能自动代理代理。为了抵消冲突,我遵循了一些我在网上找到的关于排除 Hibernate(我的 JPA 实现)使用的 CGLIBjavassist 的注释。

线索:

  • 要么全有,要么全无。我的所有@Configurable 实例都已注入(inject)或没有注入(inject)。
  • 从数据库中重新加载(重新实例化)实体似乎没有帮助;它要么工作要么不工作。
  • 多次重启 Tomcat 也无法修复它。似乎再次掷骰子的唯一事情是重新部署。换句话说,如果我重新部署它可能会起作用。

我怎样才能找出问题所在?有人在 JPA 中使用 @Configurable 吗?为什么我的 dependencyCheck = true 在没有实际注入(inject)依赖项时不会抛出错误?

实体

@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 作为依赖项注入(inject)到数据模型类中可能不是一个好主意。但这是一个设计问题。

对于@Configurable 的使用,我在从Spring 上下文之外实例化对象的情况下使用它——例如Web 应用程序、过滤器或servlet 中的自定义标签。我尝试使用它们的第一种方法是像你一样通过加载时间编织。这工作得很好,但它有一些缺点,比如热代码部署,而调试不再起作用。

我也确实遇到了您描述的问题,因此我决定从加载时间编织切换到编译时间。因此我安装了AJDT plugin在 Eclipse 中并使用了 Spring 的方面支持。这解决了我的问题。

关于java - 为什么 Spring 的 @Configurable 有时有效,有时无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/828747/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com