这是一个带有Hibernate的Spring MVC项目.我正在尝试创建一个Logger类,负责将日志输入数据库.其他类只调用具有一些属性的正确方法,这个类应该做所有的魔术.本质上它应该是一个具有静态方法的类,但这会导致autoiering dao对象出现问题.
public class StatisticLogger {
@Autowired
static Dao dao;
public static void AddLoginEvent(LogStatisticBean user){
//TODO code it god damn it
}
public static void AddDocumentEvent(LogStatisticBean user, Document document, DocumentActionFlags actionPerformed){
//TODO code it god damn it
}
public static void addErrorLog(Exception e, String page, HashMap<String, Object> parameters){
ExceptionLogBean elb=new ExceptionLogBean();
elb.setStuntDescription(e);
elb.setSourcePage(page);
elb.setParameters(parameters);
if(dao!=null){ //BUT DAO IS NULL
dao.saveOrUpdateEntity(elb);
}
}
Run Code Online (Sandbox Code Playgroud)
怎么做对了?我该怎么做才能使dao对象为null?我知道我可以将它作为方法参数传递,但这不是很好.我猜测autowired无法在静态对象上工作,因为它们是为早期创建的,所以尚未创建自动维护机制.
我想获取类的所有方法,包括public,protected,package和private方法,以及包括继承的方法.
记得:
Class.getDeclaredMethods()
获取public,protected,package和private方法,但不包括继承的方法.Class.getMethods
获取继承的方法,但只获取公共方法.在Java 8之前,我们可以做一些事情:
Collection<Method> found = new ArrayList<Method>();
while (clazz != null) {
for (Method m1 : clazz.getDeclaredMethods()) {
boolean overridden = false;
for (Method m2 : found) {
if (m2.getName().equals(m1.getName())
&& Arrays.deepEquals(m1.getParameterTypes(), m2
.getParameterTypes())) {
overridden = true;
break;
}
}
if (!overridden) found.add(m1);
}
clazz = clazz.getSuperclass();
}
return found;
Run Code Online (Sandbox Code Playgroud)
但是现在,如果类使用默认方法实现某些接口而不被具体超类覆盖,则这些方法将逃避上述检测.此外,现在有关于具有相同名称的默认方法的规则,并且还必须考虑这些规则.
问题:获取类的所有方法的当前推荐方法是什么:
"all"的最常见定义应该是可以在类的实例方法中直接访问的方法,而不使用super
或类名:
@BeforeClass
如果要在所有@Test
方法之前运行一次,JUnit的注释必须声明为static .但是,这不能用于依赖注入.
@Autowire
在运行JUnit测试之前,我想用Spring Boot 清理一个数据库.我不能@Autowire
静态字段所以我需要考虑一个解决方法.有任何想法吗?
spring ×2
autowired ×1
hibernate ×1
inheritance ×1
java ×1
java-8 ×1
junit ×1
reflection ×1
spring-boot ×1
spring-mvc ×1
static-class ×1
unit-testing ×1