2

我想将 bean A 的实例自动连接到 A 的同一个实例。如何使用注释(没有 XML)来实现这一点。

例子:

@Service
public class A {

    @Autowire
    A a;

}

我也试过

@Service
public class A {

    A a;

    @Autowired
    public void setA(final A a) {
        this.a = a;
    }

}

但它也不起作用:-/

使用类似 XML 的配置

<bean id="a" class="A">
    <property name="a" ref="a" />
</bean>

工作正常。而且还可以使用

@Service
public class A implements InitializingBean {

    A a;

    @Autowired
    ApplicationContext ctx;

    @Override
    public void afterPropertiesSet() throws Exception {
        a = ctx.getBean(A.class);
    }

}

但这很麻烦。奇怪的是,Spring 可以在使用 XML 配置时处理这个问题,但在使用基于注释的配置时不能。

4

3 回答 3

4

@Autowired在寻找自动装配候选者时跳过带注释的 bean,@Resource而是使用。

于 2013-06-24T17:03:34.540 回答
0

您可以使用编译时编织(使用 Aspectj 编译器),因此方面不需要代理即可工作。只需将其添加到您的 pom.xml 配置中:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
</dependency>

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <configuration>
        <aspectLibraries>
            <aspectLibrary>
                <groupId>org.springframework</groupId>
                <artifactId>spring-aspects</artifactId>
            </aspectLibrary>
        </aspectLibraries>
    </configuration>
</plugin>
于 2013-10-29T09:24:07.240 回答
0

我是否理解正确,您的根本问题是因为您从同一个类的非事务性方法中调用事务性方法而未应用您的事务性建议这一事实吗?您不能将事务代码提取到另一个类中吗?这不是比这个恕我直言的奇怪结构更具可读性吗?

例如。

@Service
public class A {

  @Autowired B b;

  void doSomething() {
     b.m();  
  }
}

public class B {

   @Transactional
   void m() { .. }
}
于 2013-06-24T20:10:34.217 回答