我有一个使用注释的大型弹簧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
答案 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,我就是这样做的:
答案 2 :(得分:0)
解决这个问题的一种方法是使用aspectj(编译时编织)。例如,以下方面允许编译器为使用@XmlRootElement用法注释的类的ctor创建错误(但在运行时,容器当然可以反射性地调用它)
import javax.xml.bind.annotation.XmlRootElement;
public aspect CtorError {
declare error : call ((@XmlRootElement *).new(..)) : "ctor called";
}