如何在同一个bean中自动装配bean

时间:2013-06-24 15:27:07

标签: spring dependency-injection

我想将bean的实例自动装配到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配置时可以处理这个问题,但在使用基于注释的配置时却不能处理。

3 个答案:

答案 0 :(得分:4)

@Autowired在寻找autowire候选者时跳过带注释的bean,而是使用@Resource

答案 1 :(得分:0)

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

例如

@Service
public class A {

  @Autowired B b;

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

public class B {

   @Transactional
   void m() { .. }
}

答案 2 :(得分: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>