反射类似于new出来的对象,不在spring容器中,所以spring的注解全都无效,当然包括事物@Transactional!
也可以通过代码的方式从applicationContext中取出需要注入的属性
Service service = (Service) SpringContextUtil.getBean("service");
注意:要放在方法中,不要声明为成员变量,否则启动程序时会实例化失败报异常的
spring配置
<bean id="springContextUtil" class="com.xxx.xxx.xxx.util.SpringContextUtil"/>
放上工具类:
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext; // Spring应用上下文环境
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if(SpringContextUtil.applicationContext == null){
SpringContextUtil.applicationContext = applicationContext;
}
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public static Object getBean(String name) throws BeansException {
return applicationContext.getBean(name);
}
public static Object getBean(String name, Class requiredType)
throws BeansException {
return applicationContext.getBean(name, requiredType);
}
public static boolean containsBean(String name) {
return applicationContext.containsBean(name);
}
public static boolean isSingleton(String name)
throws NoSuchBeanDefinitionException {
return applicationContext.isSingleton(name);
}
public static Class getType(String name)
throws NoSuchBeanDefinitionException {
return applicationContext.getType(name);
}
public static String[] getAliases(String name)
throws NoSuchBeanDefinitionException {
return applicationContext.getAliases(name);
}
}