一、利弊
针对001 中设置,不方便程序中动态添加任务,只能使用配置进行配置任务,
适用于已知固定时刻需要执行的任务。
针对002中设置,不方便结合调用spring注入的实体
使用于程序内部新增添的任务
二、结合spring以及动态添加任务
1.编写ApplicationContext对象注入类
@Component public class SpringContextUtil implements ApplicationContextAware { // Spring应用上下文环境 private static ApplicationContext applicationContext; /** * 实现ApplicationContextAware接口的回调方法。设置上下文环境 * * @param applicationContext */ @Override public void setApplicationContext(ApplicationContext applicationContext) { SpringContextUtil.applicationContext = applicationContext; } /** * @return ApplicationContext */ public static ApplicationContext getApplicationContext() { return applicationContext; } /** * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. */ @SuppressWarnings("unchecked") public static <T> T getBean(String name) { checkApplicationContext(); if (applicationContext.containsBean(name)) { return (T) applicationContext.getBean(name); } return null; } /** * 从静态变量ApplicationContext中取得Bean, 自动转型为所赋值对象的类型. */ @SuppressWarnings("unchecked") public static <T> T getBean(Class<T> clazz) { checkApplicationContext(); return (T) applicationContext.getBean(clazz); } private static void checkApplicationContext() { if (applicationContext == null){ throw new IllegalStateException("applicaitonContext未注入,请在applicationContext.xml中定义SpringContextUtil"); } } /** * 同步方法注册bean到ApplicationContext中 * * @param beanName * @param clazz * @param original bean的属性值 */ public static synchronized void setBean(String beanName, Class<?> clazz,Map<String,Object> original) { checkApplicationContext(); DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory(); if(beanFactory.containsBean(beanName)){ return; } //BeanDefinition beanDefinition = new RootBeanDefinition(clazz); GenericBeanDefinition definition = new GenericBeanDefinition(); //类class definition.setBeanClass(clazz); //属性赋值 definition.setPropertyValues(new MutablePropertyValues(original)); //注册到spring上下文 beanFactory.registerBeanDefinition(beanName, definition); } /** * 删除spring中管理的bean * @param beanName */ public static void removeBean(String beanName){ ApplicationContext ctx = SpringContextUtil.getApplicationContext(); DefaultListableBeanFactory acf = (DefaultListableBeanFactory) ctx.getAutowireCapableBeanFactory(); if(acf.containsBean(beanName)) { acf.removeBeanDefinition(beanName); } } /** * 根据bean的id来查找对象 * * @param id * @return */ public static <T> T getBeanById(String id) { return (T) applicationContext.getBean(id); } }