@Service
public class AServiceImpl implements AService {
//static
public static AServiceImpl dynamicProxy;
@Autowired
private AMapper aMapper;
@PostConstruct
public void init() {
System.out.println("AServiceImpl init");
dynamicProxy = this;
}
@Override
public void select() {
//使用
int countInDb = dynamicProxy.aMapper.selectCount();
}
Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)
按照上述方法,第一天执行OK,第二天异常了。。
网络搜索解决方案如下,问题解决~
反射获取service接口中的方法执行报异常:java.lang.InstantiationException
普通类调用Spring Bean对象
java.lang.InstantiationException 出现这种异常的原因通常情况下是由于要实例化的对象是一个接口或者是抽象类等无法被实例化的类。
通过CSDN搜索文章SpringBoot 普通类获取Spring容器中的bean(SpringUtil)解决!
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* SpringBoot 普通类获取Spring容器中的bean工具类
* @author lvgang
*/
@Component
public class SpringBootBeanUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringBootBeanUtil.applicationContext == null) {
SpringBootBeanUtil.applicationContext = applicationContext;
}
System.out.println("========ApplicationContext配置成功========");
System.out.println("========在普通类可以通过调用SpringBootBeanUtil.getApplicationContext()获取applicationContext对象========");
System.out.println("========applicationContext="+ SpringBootBeanUtil.applicationContext +"========");
}
/**
* 获取applicationContext
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过name获取 Bean.
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
/**
* 通过class获取Bean.
* @param clazz
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过name,以及Clazz返回指定的Bean
* @param name
* @param clazz
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}
使用
String methodName = MethodEnum.findField("method1");
try {
//从ApplicationContext中取出已创建好的的对象
//不可直接反射创建serviceimpi对象,因为反射创建出来的对象无法实例化dao接口
ApplicationContext applicationContext = SpringBootBeanUtil.getApplicationContext();
//反射创建serviceimpi实体对象,和实体类
Class<?> ServiceImplType = Class.forName("com.cmft.service.BBBService");
//反射设置方法参数。
Method method = ServiceImplType.getDeclaredMethod(methodName);
//在ApplicationContext中根据class取出已实例化的bean
method.invoke(applicationContext.getBean(ServiceImplType));
} catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
log.error("个性化表单数据插入失败");
}