2013-06-24 108 views
1

我想将bean A的实例自动装入到同一个实例A.我怎样才能通过注释(无XML)来实现这一点。使用像如何在同一个bean中自动装配bean

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

XML工作正常/

配置 - :

例子:

@Service 
public class A { 

    @Autowire 
    A a; 

} 

我也试过

@Service 
public class A { 

    A a; 

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

} 

,但它不是工作压力太大。也有可能使用

@Service 
public class A implements InitializingBean { 

    A a; 

    @Autowired 
    ApplicationContext ctx; 

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

} 

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

+0

也许我在这里错过了一些东西,但为什么您需要做这个***? –

+0

因为我想从A中调用A中的方法'm()',而且还要使用未使用调用'this.m()'的代理来处理事务('@ Transactional')。 – Betlista

回答

3

@Autowired当查找自动导向候选项时跳过注释的bean,请改为使用@Resource

+0

谢谢,我不知道。它的工作原理;-) – Betlista

0

我是否理解它是正确的,并且是您的根本问题,因为您在同一个类中的非事务性方法内调用事务性方法,因此您的事务性建议未应用?你不能把事务代码提取到另一个类中吗?没有比这个imho真奇怪的结构更可读吗?

例如,

@Service 
public class A { 

    @Autowired B b; 

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

public class B { 

    @Transactional 
    void m() { .. } 
} 
+0

当我有,比方说'AccountService'我想要有与该服务中的帐户相关的所有方法,而不是'AccountServiceTransactional'和'AccountServiceWithNewTransaction'。 – Betlista

+0

那么在A @Transactional中做每个方法呢?也是从A中调用m()的方法? – davidcyp

+0

我的服务是事务性的,但对于某些我想要新事务的方法,这些方法也可以从服务中调用... – Betlista

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> 
相关问题