我遇到了一个奇怪的问题(或者只是对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
使用辅助数据库。
答案 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");
}
?>