一:了解几个注解和执行顺序:
@PostConstruct > InitializingBean(@afterPropertiesSet) > init-method
这几个注解都是spring初始化的时候生效的。谈谈使用场景:
@PostConstruct:我们在策略模式的时候可以使用,初始化把不同策略装配到不同的Type。
InitializingBean(@afterPropertiesSet): 通过类实现该接口。执行一些spring加载完就需要执行的操作 或 同上的策略模式场景。
init-method:(初始化加载一些自定义配置文件: 例如第三方接口的参数)。
二: 说一说:ApplicationContextAware。spring容器初始化获取类实例的方法。通常用来构造静态实例。提供静态公用方法。以xxxxxEngine命名。类似一个执行引擎。其他类直接 xxxxxEngine.run() 来执行操作。(其实这样做和@Component标志成Bean是一个意思。所以这样写的好处是啥?
思考2个问题:1:为什么第三方的工具包的公共方法都是静态的?
2: 如何在静态方法中调用被Spring动态注入类的方法?)
1:
public class JobLaunchEngine implements ApplicationContextAware {
private static final Logger LOGGER = LoggerFactory.getLogger(JobLaunchEngine.class);
private static JobLaunchEngine instance;
@Autowired
private JobLauncher jobLauncher;
/**
* 获取job执行器
*
* @param job job
* @param parameters job参数
* @return 执行器
*/
public static JobExecution run(Job job, JobParameters parameters) {
LOGGER.info("开始处理报表回款解析任务");
try {
Assert.notNull(job, "xml target job can not be null");
return JobLaunchEngine.instance.jobLauncher.run(job, parameters);
} catch (Exception e) {
LOGGER.error("处理报表回款任务异常!", e);
throw new ApplicationException("处理报表回款任务异常!" + e);
}
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Assert.notNull(jobLauncher, "spring batch jobLauncher can not be null");
instance = applicationContext.getBean(JobLaunchEngine.class);
}
}
2:spring配置文件中配置:
<bean id="jobLaunchEngine" class="com.fee.batch.JobLaunchEngine"></bean>