找到所有不是@Autowired的课程

时间:2016-05-14 00:45:16

标签: java eclipse spring-mvc

我有一个使用注释的大型弹簧Web应用程序。但是,有些类使用@ component / service进行注释,但不会从调用它们的位置进行自动装配。相反,使用新的运算符。

我想找出所有使用new运算符的用户定义类的实例。

基本上,我创建了一个新的Http包装类(spring组件),我从应用程序的多个位置调用它。有些地方它的工作原理是因为它的自动连接是有效的,因为包含类和链开头的类是由spring管理的。但是有些地方它不起作用,因为调用链中的一个类是使用new实例化的,而不是Spring管理的。所以我想解决这个问题,让这些课程也得到春季管理。

我说的是100多个课程,所以请建议一个可以在3-4个小时内完成的工具或方法,以防止人为错误。我用eclipse。

示例:

<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* create a prepared statement */
$stmt =  $mysqli->stmt_init();
if ($stmt->prepare("SELECT District FROM City WHERE Name=?")) {

    /* bind parameters for markers */
    $stmt->bind_param("s", $city);

    /* execute query */
    $stmt->execute();

    /* bind result variables */
    $stmt->bind_result($district);

    /* fetch value */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* close statement */
    $stmt->close();
}

/* close connection */
$mysqli->close();
?>

请不要建议:

@Component
public class MyHttpClient {

    public int execute() {
        ...
    }
}

@Component
public class UtilC {

    @Autowired
    private MyHttpClient client;

    public int methodC() {
        // When methodC is called from A, it works
        // but when called from B, it gives NullPointerException
        client.execute();
    }
}

@Component
public class UtilB {

    private UtilC c = new UtilC();

    public int methodB() {
        c.methodC();
    }
}

@Component
public class UtilA {

    @Autowired
    private UtilC c;

    public int methodA() {
        c.methodC();
    }
}

如何搜索所有已实例化的用户定义类,如新的UtilC

3 个答案:

答案 0 :(得分:0)

使用Google reflection查找使用@Autowired

注释的所有类
Reflections reflections = new Reflections("org.home.xxx");
Set<Class<?>> annotated = reflections.getTypesAnnotatedWith(org.springframework.beans.factory.annotation.Autowired.class);

Set中没有的类没有注释。

答案 1 :(得分:0)

如果您有“使用注释的大型Spring Web应用程序”,则必须使用正确的Java IDE。每个IDE都有此功能,称为“查找用法”(或类似的东西)。你应该使用它。

例如,使用Intellij IDEA,我就是这样做的:

  1. 找到Autowired界面(在源代码中)。使用“查找用法”。 enter image description here
  2. 它应该显示用法(根据用法的种类很好地分类)。enter image description here

答案 2 :(得分:0)

解决这个问题的一种方法是使用aspectj(编译时编织)。例如,以下方面允许编译器为使用@XmlRootElement用法注释的类的ctor创建错误(但在运行时,容器当然可以反射性地调用它)

import javax.xml.bind.annotation.XmlRootElement;

public aspect CtorError {

    declare error : call ((@XmlRootElement *).new(..)) : "ctor called";
}