Java 为什么@Bean方法是代理的而不是组件';我们的方法不在春天吗?

Java 为什么@Bean方法是代理的而不是组件';我们的方法不在春天吗?,java,spring,spring-aop,Java,Spring,Spring Aop,考虑两个简单的例子 (一) 在这种情况下,某种类型的AOP(是否?)将启动,myBean()将只被调用一次 (二) 现在,为什么这两个案例不同?为什么这里的行为不协调?我确信,为了让spring中的AOP工作,我必须始终使用场景2并对代理实例执行“外部调用”。我还认为场景1将创建4个不同的实例 那么,有什么区别,为什么会有这种不一致性呢 或者场景2不再有效,因为有些事情发生了变化,而我只是不知道?不确定您的意思。@Bean方法只创建一个实例,它与@Component的构造函数相同,而不是它的方法

考虑两个简单的例子

(一)

在这种情况下,某种类型的AOP(是否?)将启动,
myBean()
将只被调用一次

(二)

现在,为什么这两个案例不同?为什么这里的行为不协调?我确信,为了让spring中的AOP工作,我必须始终使用场景2并对代理实例执行“外部调用”。我还认为场景1将创建4个不同的实例

那么,有什么区别,为什么会有这种不一致性呢


或者场景2不再有效,因为有些事情发生了变化,而我只是不知道?

不确定您的意思。
@Bean
方法只创建一个实例,它与
@Component
的构造函数相同,而不是它的方法。您对正在创建的四个不同实例的假设是错误的,它是一致的。请注意,我在
anotherBean
中对该方法执行“普通调用”。通常它在
@组件中被称为eg,但在这里不是。那个么为什么AOP在这里的工作方式不同呢?是的,但那个些调用(我假设)是在
@配置中的
,它强制只创建一个实例(singleton)。我没有“为什么”的答案,但条件1是一个特例。条件2仍然需要
instance.method()
才能进入事务。是否回答了您的问题?
@Bean
public MyBean myBean(){
    ..create and return
}

@Bean 
public Another anotherBean(){
  new Another(myBean());
  myBean();
  myBean();
  myBean();
}
@Component 
public class MyClass{

.....

@Autowired
private MyClass self;

@Transactional
public void inTx(){

}

public void doIt(){
   inTx(); //this will NOT be transactional
   self.inTx(); // this will 
}

}