package com.github.dadiyang.bestpractice.SpringUtil;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* https://www.cnblogs.com/codechange/p/11238117.html
* https://blog.csdn.net/liulimoyu/article/details/91373395?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-4
*/
@Component
public class SpringContextUtil implements ApplicationContextAware {
// @Autowired
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
if (SpringContextUtil.applicationContext == null) {
this.applicationContext = applicationContext;
}
System.out.println("this.applicationContext = applicationContext;配置成功");
}
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
/**
* 通过类名获取bean
*
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过名称获取bean
*
* @param beanName
* @param <T>
* @return
*/
public static <T> T getBean(String beanName) {
return (T) getApplicationContext().getBean(beanName);
}
/**
* @param beanName 名称
* @param clazz 类的名称
* @param <T>
* @return
*/
public static <T> T getBean(String beanName, Class<T> clazz) {
return getApplicationContext().getBean(beanName, clazz);
}
}
package com.github.dadiyang.bestpractice.SpringUtil;
import org.springframework.stereotype.Component;
@Component
public class EcExector extends AbstractExecutor {
@Override
public void exector() {
System.out.println("EcExector do someThing");
}
}
package com.github.dadiyang.bestpractice.SpringUtil;
import org.springframework.stereotype.Component;
@Component
public class DiscoeryExect extends AbstractExecutor {
@Override
public void exector() {
System.out.println("处理discoeryExect");
}
}
package com.github.dadiyang.bestpractice.SpringUtil;
public class DealThing {
public static AbstractExecutor getExector(Class beanName) {
AbstractExecutor bean = (AbstractExecutor) SpringContextUtil.getBean(beanName);
return bean;
}
// public static void main(String[] args) {
// AbstractExecutor exector = getExector("com.github.dadiyang.bestpractice.SpringUtil.DiscoeryExect");
// exector.doSomeThing();
// }
}
package com.github.dadiyang.bestpractice.SpringUtil;
import org.springframework.stereotype.Component;
@Component
public abstract class AbstractExecutor {
public void doSomeThing() {
System.out.println("调用之前的处理");
this.exector();
System.out.println("做相同的事情");
}
public abstract void exector();
}
package com.github.dadiyang.bestpractice.SpringUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SpringController {
@ResponseBody
@RequestMapping("/getApplication")
public String getApplication() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
Class clazz = Class.forName("com.github.dadiyang.bestpractice.SpringUtil.DiscoeryExect");
AbstractExecutor exector = DealThing.getExector(clazz);
exector.doSomeThing();
return "success";
}
}
注意:
在解决代码冗余,以及代码抽取,代码分层,以及动态获取抽象类的子类中有很大作用.