Java 对Spring的依赖性';s注释

Java 对Spring的依赖性';s注释,java,spring,annotations,Java,Spring,Annotations,我已经用@Repository、@Resource、@Component、@Service注释了我的类,但是这些类必须在2个环境中运行。第一个环境是基于Spring2.x的,而另一个环境根本没有Spring。我确信如果没有spring JAR,代码一定会失败&我想知道您对如何保留注释但仍能在这两种环境下工作的看法对于Java中的每个注释,都有一个相应的类文件。如果找到使用的注释,可以将类文件复制到其他环境中 我不确定这些类是否也依赖于其他类;它们可能不是,因为注释是不可变的纯数据对象。如果该类还

我已经用@Repository、@Resource、@Component、@Service注释了我的类,但是这些类必须在2个环境中运行。第一个环境是基于Spring2.x的,而另一个环境根本没有Spring。我确信如果没有spring JAR,代码一定会失败&我想知道您对如何保留注释但仍能在这两种环境下工作的看法

对于Java中的每个注释,都有一个相应的类文件。如果找到使用的注释,可以将类文件复制到其他环境中


我不确定这些类是否也依赖于其他类;它们可能不是,因为注释是不可变的纯数据对象。如果该类还具有方法,则可以重新编译(使用相同的序列化ID)注释源,而不使用方法(即仅字段),以便在其他环境中使用。

由于无法删除已接受的帖子,我建议您阅读/投票Hans的帖子,这是一个比我原来的帖子更好的解释:


当使用原型注释(@Service等)时,获得编译时bean验证的代价是在代码中耦合到spring上下文库。我认为有3种直接的选择:

1) 删除注释,并在XML中配置bean

2) 将spring-context.jar(或包含原型注释的等效库)复制到非spring项目中以解决依赖关系,但保持spring未配置,以便在代码中不使用它

3) 从具体类中删除注释,并使用“Spring”版本对其进行扩展。这种方法可能会或可能不会对您的设计造成一点影响,但值得考虑:

public class MyDAO {
    protected SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    // .. Your DAO code resides here ..
}
以及Spring子类:

@Repository
public class MySpringDAO extends MyDAO {

    @AutoWired
    protected SessionFactory sessionFactory;
}

这样,您的非Spring项目就可以使用“MyDAO”,并将“MySpringDAO”类从构建中排除。

为了能够使用您提到的注释,或者让Spring为您使用注释,这样您就可以获得好处,您至少需要使用Spring 2.5.x,这就是它们被引入的时候


此外,注释不需要位于类路径上。他们只会被忽略。因为当您使用Spring2.0时,不会有代码试图“扫描”它们。

如果spring迫使您使类直接依赖于它,那就不是spring了

您可以定义自己的注释,这些注释的用途与spring验证的注释相同。例如,定义com.yourcompany…组件等

我假设您在spring配置中的某个地方使用了
。 只需添加
使用defaultfilters=“false”
并定义自己的过滤器以匹配注释


寻找真正完成繁重工作的后处理器。可以将它们配置为使用另一组注释<代码>@Repository由
PersistenceExceptionTranslationPostProcessor
检查。可以将此后处理器配置为使用与注释等效的内容

您仍然对这些注释具有编译时依赖性。由于您的.class文件中编译了注释,我假设您的类路径上也需要注释.class文件。不是这样吗?不是:)为了验证我刚刚测试过。我创建了一个带有main()的小项目。该类使用我编写的MyAnnotation进行注释。我在命令行上运行它,然后手动删除注释的.class文件并再次运行它。它仍然有效。你自己试试:)请注意,我的注释是用@Retention(RetentionPolicy.RUNTIME)自己注释的。谢谢你,肖恩,谢谢你。