Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring CGLIB增强bean中的构造函数注入字段为空_Java_Spring - Fatal编程技术网

Java Spring CGLIB增强bean中的构造函数注入字段为空

Java Spring CGLIB增强bean中的构造函数注入字段为空,java,spring,Java,Spring,我有一个存储库: @Repository public class MyRepository { private final NamedParameterJdbcTemplate namedParameterJdbcTemplate; public MyRepository(NamedParameterJdbcTemplate namedParameterJdbcTemplate) { this.namedParameterJdbcTemplate = namedParame

我有一个存储库:

@Repository
public class MyRepository {

  private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;

  public MyRepository(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
    this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
  }

  void doSomething() {
    namedParameterJdbcTemplate.update(...);
  }
}
它在SpringBoot 1.4.5(SpringCore和JDBC4.3.7)中的工作与预期的一样。调试
doSomething()
时,我可以看到
MyRepository
的实例是一个普通对象,并且设置了
namedParameterJdbcTemplate

但是,只要我更新到Spring Boot 1.4.6(Spring Core和JDBC 4.3.8)或更高版本,
MyRepository
的实例就是一个
MyRepository$$EnhancerBySpringCGLIB
namedParameterJdbcTemplate
null
。我看到它被注入到构造函数中,然而,此时我的存储库还没有得到CGLIB的增强


为什么呢?我在中找不到任何提示。

即使我不能在最小的示例中复制它,我的被接受。

即使我不能在最小的示例中复制它,我的被接受。

我有一个类似的问题。。。我通过将方法改为public而不是protected来修复我的案例

你试过了吗

@Repository
public class MyRepository {

  private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;

  public MyRepository(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
    this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
  }

  public void doSomething() {
    namedParameterJdbcTemplate.update(...);
  }
}

我也有类似的问题。。。我通过将方法改为public而不是protected来修复我的案例

你试过了吗

@Repository
public class MyRepository {

  private final NamedParameterJdbcTemplate namedParameterJdbcTemplate;

  public MyRepository(NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
    this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
  }

  public void doSomething() {
    namedParameterJdbcTemplate.update(...);
  }
}

我有一些相关的事情。我的方法是final,因此Spring使用CGLIB代理类而不是默认行为(springaop代理类)。因此,为了访问类属性,我必须调用getXXX()方法,否则,每次我试图访问该属性时,该属性都会返回null

我有一些相关信息。我的方法是final,因此Spring使用CGLIB代理类而不是默认行为(springaop代理类)。因此,为了访问类属性,我必须调用getXXX()方法,否则,每次我尝试访问该属性时,该属性都会返回null

//检查我们是否只有一个InvokerInterceptor:即,
//没有真正的建议,只是对目标的反射调用。
if(chain.isEmpty()&&Modifier.isPublic(method.getModifiers()){
/* 
我们可以跳过创建MethodInvocation:直接调用目标。
请注意,最后一个调用程序必须是InvokeInterceptor,因此我们知道
它除了在目标上进行反射操作外,什么也不做,而且没有发热
交换或幻想代理。
*/
对象[]argsToUse=aopproxutils.adapteArgumentSifEssential(方法,args);
retVal=methodProxy.invoke(目标,argsToUse);
}否则{
//我们需要创建一个方法调用。
retVal=新的CglibMethodInvocation(代理、目标、方法、参数、目标类、链、方法代理)。继续();
}
//检查我们是否只有一个InvokeInterceptor:,
//没有真正的建议,只是对目标的反射调用。
if(chain.isEmpty()&&Modifier.isPublic(method.getModifiers()){
/* 
我们可以跳过创建MethodInvocation:直接调用目标。
请注意,最后一个调用程序必须是InvokeInterceptor,因此我们知道
它除了在目标上进行反射操作外,什么也不做,而且没有发热
交换或幻想代理。
*/
对象[]argsToUse=aopproxutils.adapteArgumentSifEssential(方法,args);
retVal=methodProxy.invoke(目标,argsToUse);
}否则{
//我们需要创建一个方法调用。
retVal=新的CglibMethodInvocation(代理、目标、方法、参数、目标类、链、方法代理)。继续();
}

我想你应该试试这样的东西
@Autowired
公共MyRepository(NamedParameterJdbcTemplate NamedParameterJdbcTemplate){
this.NamedParameterJdbcTemplate=NamedParameterJdbcTemplate;
我试过了,但没有改变任何东西。而且,我确实看到了正在注入的实例。但是当Spring创建其CGLIB增强bean时,该字段变为
null
。这只是一个假设,但似乎
NamedParameterJdbcTemplate
不是bean,所以这可能是个问题。如果它不是bean,它将如何被注入构造函数?Spring 4.3.7是如何工作的?我想您应该尝试类似这样的东西。
@Autowired
公共MyRepository(NamedParameterJdbcTemplate NamedParameterJdbcTemplate){
this.NamedParameterJdbcTemplate=NamedParameterJdbcTemplate;
我尝试过,但没有改变任何东西。而且,我确实看到了正在注入的实例。但是当Spring创建其CGLIB增强bean时,该字段变为
null
。这只是一个假设,但似乎
NamedParameterJdbcTemplate
不是bean,所以这可能是个问题。如果它不是bean,它将如何被注入构造函数?它在Spring4.3.7中是如何工作的?