@Service
@Transactional(rollbackFor = Exception.class)
public class testService {
@Autowired
TestMapper testMapper;
/**第一步*/
private static TestService testService;
/**第二步*/
@PostConstruct
public void init(){
testService = this;
testService.testMapper = this.testMapper;
}
public List<Test> getList(Integer page, Integer size, String keywords) {
int start = (page - 1) * size;
Date endDate = null;
Date startDate = null;
String methodName = "testMethod";
list = (List<Test>) testService.invoke("org.basic.service.testService",
methodName , start, size, keywords);
return list;
}
/**
* 反射調(diào)用動(dòng)態(tài)方法
*/
public List<Test> testMethod(Integer start, Integer size, String keywords){
List list = null;
try {
/**第三步*/
list = testService.testMapper.getListByPage(start, size, keywords);
}catch (NullPointerException e){
e.printStackTrace();
}
return list;
}
/**
* 方法反射
* @param className
* @param methodName
* @param params
* @return
*/
public static Object invoke(String className, String methodName, Object...params){
try {
Class<?> c = Class.forName(className);
Object obj = c.newInstance();
Method[] methods = c.getDeclaredMethods();
Method callMethod = null;
for(Method method:methods){
if(method.getName().equals(methodName)){
callMethod = method;
break;
}
}
callMethod.setAccessible(true);
return callMethod.invoke(obj, params);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Autowired標(biāo)簽自動(dòng)注入TestMapper失敗满力,可能出現(xiàn)的空指針報(bào)錯(cuò):
java.lang.NullPointerException
解決:注意代碼中標(biāo)明的第一步,第二步,第三步
從Java EE5規(guī)范開(kāi)始,Servlet增加了兩個(gè)影響Servlet生命周期的注解(Annotation):@PostConstruct和@PreConstruct煮嫌。這兩個(gè)注解被用來(lái)修飾一個(gè)非靜態(tài)的void()方法.而且這個(gè)方法不能有拋出異常聲明丢间。
被@PostConstruct修飾的方法會(huì)在服務(wù)器加載Servlet的時(shí)候運(yùn)行,并且只會(huì)被服務(wù)器調(diào)用一次亩鬼,類(lèi)似于Serclet的inti()方法殖告。被@PostConstruct修飾的方法會(huì)在構(gòu)造函數(shù)之后,init()方法之前運(yùn)行雳锋。
被@PreDestroy修飾的方法會(huì)在服務(wù)器卸載Servlet的時(shí)候運(yùn)行黄绩,并且只會(huì)被服務(wù)器調(diào)用一次,類(lèi)似于Servlet的destroy()方法玷过。被@PreDestroy修飾的方法會(huì)在destroy()方法之后運(yùn)行爽丹,在Servlet被徹底卸載之前。