@Autowired覆盖@Bean

时间:2017-06-13 06:19:35

标签: java spring

我遇到了一个奇怪的问题(或者只是对Spring 4.1.7的一些误解):

有一个组件,让我们称它为MyComponent,看起来像这样......

@Component
public class MyComponent extends BaseComponent {
...
}

BaseComponent是这样的......

public class BaseComponent {    
   @Autowired
   private HibernateTemplate hibernateTemplate;

   public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
      this.hibernateTemplate = hibernateTemplate;
   }
}

虽然由于历史原因使用@Component注释了类,但是没有为此包激活组件扫描,因此将不会自动找到组件。因此我在@Configuration中有一个定义......

@Configuration
public class MyConfiguration {

 @Bean 
 public HibernateTemplate hibernateTemplate() { ... create one ... }


 @Bean 
 public HibernateTemplate hibernateTemplateSecondary() { ... create another one ... }


 @Bean
 public MyComponent myComponent() {
    MyComponent component = new MyComponent();
    component.setHibernateTemplate( hibernateTemplateSecondary() );
    return component;
 } 
}

不幸的是,现在发生的是,myComponent将首先使用辅助HibernateTemplate正确初始化,但之后,Spring会注入" 正常" hibernateTemplate进入它(这是错误的)。

我试图明确地将autowire = Autowire.NO添加到@Bean定义中,即使它已经是默认值...也没有两个myComponent bean,它&#39 ; s总是一样的......

有谁知道为什么会这样,如果是这样,如何防止它?我一直认为,当涉及@Bean时,@ Autowired不会覆盖它?

请注意:由于MyComponent也用于其他项目,我绝对无法触及它。我无法移除@Autowired,我无法添加@Qualifier或类似内容,因为这会打破很多其他项目。通常,它工作正常,因为它使用" primary" (通常只有)数据库连接。就在这个模块中,另一个数据库应该是主数据库,因此需要告诉MyComponents使用辅助数据库。

3 个答案:

答案 0 :(得分:1)

你不能在BaseComponent中使用@Qualifier(" hibernateTemplateSecondary"),这样它可以拿起正确的bean吗?

@Autowired
@Qualifier("hibernateTemplateSecondary")
private HibernateTemplate hibernateTemplate;

另一种方法是使用在您的情况下看起来不太好的主要注释(考虑到它是您的次要bean)

@Bean 
@Primary
public HibernateTemplate hibernateTemplateSecondary() { ... create another one ... }

答案 1 :(得分:1)

也许有更好的解决方案,但你可以用这样的BeanPostProcessor来解决这个问题:

(tensorflow) C:\Users\alfred.datui>python
Python 3.6.1 |Continuum Analytics, Inc.| (default, May 11 2017, 13:25:24) [MSC v
.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'tensorflow'
>>>

这将在初始化bean之后注入正确的模板,并将覆盖错误的模板。

答案 2 :(得分:0)

我只是通过Google搜索同一问题偶然发现了你的问题。我这样解决了: (在春季启动2.0 /春季5.0测试)

  <?php
   session_start(); 
   // this should be called first before including external files 
   include('config.php');

   $user_check = $_SESSION['login_user'];

   $ses_sql = mysqli_query($conn,"select email_adress from customer where email_adress = '$user_check' ");

   $row = mysqli_fetch_array($ses_sql,MYSQLI_ASSOC);

   $login_session = $row['email_adress'];

   if(!isset($_SESSION['login_user'])){
      header("location:login.php");
   }
?>