【问题标题】:How to autowire bean in same bean如何在同一个bean中自动装配bean
【发布时间】:2013-06-24 15:27:07
【问题描述】:

我想将 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 配置时可以处理这个问题,但在使用基于注解的配置时却不行。

【问题讨论】:

  • 也许我在这里遗漏了一些东西,但是为什么你需要这样做 this
  • 因为我想从A调用A中的m()方法,还要使用代理,而不是调用this.m(),例如处理事务(@Transactional)。跨度>

标签: spring dependency-injection


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    例如。

    @Service
    public class A {
    
      @Autowired B b;
    
      void doSomething() {
         b.m();  
      }
    }
    
    public class B {
    
       @Transactional
       void m() { .. }
    }
    

    【讨论】:

    • 当我拥有AccountService 时,我希望在该服务中拥有与帐户相关的所有方法,而不是拥有AccountServiceTransactionalAccountServiceWithNewTransaction
    • 那么在 A @Transactional 中创建每个方法怎么样?还有从 A 中调用 m() 的方法?
    • 我的服务是事务性的,但是对于某些方法我想要新的事务,这些方法也从服务中调用...
    • 如果将这些@Transactional 方法的传播设置为Propagation.REQUIRES_NEW 会怎样?这能解决你的问题吗?
    • 这就是问题所在,当我有带有 REQUIRED 传播的事务方法 service.foo() 并且我使用 REQUIRES_NEW 调用 service.bar() - 未创建新事务 - 这不是代理调用。
    【解决方案3】:

    您可以使用编译时编织(使用 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2012-05-19
      • 2018-12-24
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多