工具类的一个特点是直接通过类名+方法名直接调用,不存在单例问题,但是如果没有实例,那就无法将工具类交由Spring管理,工具类也就无法通过Spring容器获取其他对象实例(当然如果说通过SpringContextUtil这类东西的话还是可以实现的)。 本质上,工具类就不应该从其他地方去获取计算数据,而是都由参数列表接受,由外部对象去调用,当然,我们这里只讨论基于Spring的util工具类如何去实现 需要实现的效果如下 1、工具类方法直接通过类名.方法名调用(静态方法) 2、可以从Spring 容器中获取计算需要的实例 # 貌似上面两点除了使用SpringContextUtil获取容器对象的方式外无法实现,因为将util对象交由Spring 管理,那么注入的对象不能是静态的,静态方法不能调用非静态成员,因此产生矛盾,所以的话退而求其次,工具类方法不直接通过类名.方法名直接调用,通过单例的方式获取单例工具从而调用工具方法 首先,通过注解@Component 将Util 交由Spring 管理, 这样就可以在工具类里面直接由Spring 自动去注入需要的对象。 其次,保证util单例,构造方法私有化,持有本类的对象实例于当前静态成员当中,并且初始化时机交由Spring Bean 生命周期去管理,简单的说就是利用@Postconstruct 注解,初始化过程 INSTANCE = this 所有的工具方法都不使用静态,改为普通方法,所有的工具类调用通过单例模式完成
简单的代码模板:@Componentpublic Class Util { public static Util INSTANCE; // Spring 容器组件,直接通过依赖注入获取对象 @Autowired private Xxxx xxx; // 这里就不需要构造函数私有化了,一旦私有,Spring 也就没办法初始化Util 对象 // 单例初始化交由Spring Bean 生命周期管理 @PostConstruct public void init(){ INSTANCE = this; } public String computeXXXXToXXXX(...){ // 工具方法 // 可以直接去调用容器对象 } }简单调用方式:Util .INSTANCE.methodXXX()
|