Springboot 中如果希望在 Utils 工具类中,使用到我们已经定义过的 Dao 层或者 Service 层 Bean,可以如下编写 Utils 类:

  1. 使用 @Component 注解标记工具类

  2. 使用 @Autowired(@Autowired 和 @Resource 的区别不再介绍) 注入我们需要的 Bean

  3. 在工具类中编写 init() 函数,并使用 @PostConstruct 注解标记工具类,初始化 Bean

1. 使用 @Component 注解标记工具类

@component (把普通 pojo 实例化到 spring 容器中)

泛指各种组件,当我们的类不属于各种归类的时候(不属于 @Controller、@Services 等),我们就可以使用 @Component 来标注这个类。

@Component //使用@Component注解标记工具类
public class Oa7SystemUrlUtils implements SystemUrl {
 
    @Autowired
    OAResourcesConfiguration oAResourcesConfiguration;
 
    static Oa7SystemUrlUtils oa7SystemUrl;
 
    @PostConstruct
    public void init(){
        oa7SystemUrl = this;
        oa7SystemUrl.oAResourcesConfiguration = this.oAResourcesConfiguration;
    }
 
    @Override
    public String getSystemUrl() {
        return oa7SystemUrl.oAResourcesConfiguration.getOaApiUrl();
    }
}

2. 使用 @Autowired 注入我们需要的 Bean

Spring 不但支持自己定义的 @Autowired 注解,还支持几个由 JSR-250 规范定义的注解(属于 J2EE,减少了与 Spring 的耦合),它们分别是 @Resource、@PostConstruct 以及 @PreDestroy。

@Resource 和 @Autowired 注解都是用来实现依赖注入的。只是 @AutoWried 按 byType 自动注入,而 @Resource 默认按 byName 自动注入。

@Component //使用@Component注解标记工具类
public class Oa7SystemUrlUtils implements SystemUrl {
 
    //使用@Autowired注入我们需要的Bean
    @Autowired
    OAResourcesConfiguration oAResourcesConfiguration;
 
    static Oa7SystemUrlUtils oa7SystemUrl;
 
    @PostConstruct
    public void init(){
        oa7SystemUrl = this;
        oa7SystemUrl.oAResourcesConfiguration = this.oAResourcesConfiguration;
    }
 
    @Override
    public String getSystemUrl() {
        return oa7SystemUrl.oAResourcesConfiguration.getOaApiUrl();
    }
}

3. 编写 init() 函数,并使用 @PostConstruct 注解标记工具类,初始化 Bean

@PostConstruct 注解好多人以为是 Spring 提供的。其实是 Java 自己的注解。

Java 中该注解的说明:@PostConstruct 该注解被用来修饰一个非静态的 void()方法。被 @PostConstruct 修饰的方法会在服务器加载 Servlet 的时候运行,并且只会被服务器执行一次。PostConstruct 在构造函数之后执行,init()方法之前执行。

通常我们会是在 Spring 框架中使用到 @PostConstruct 注解 该注解的方法在整个 Bean 初始化中的执行顺序:

Constructor(构造方法) @Autowired(依赖注入) @PostConstruct(注释的方法)

@Component //使用@Component注解标记工具类
public class Oa7SystemUrlUtils implements SystemUrl {
 
    //使用@Autowired注入我们需要的Bean
    @Autowired
    OAResourcesConfiguration oAResourcesConfiguration;
 
    static Oa7SystemUrlUtils oa7SystemUrl;
 
    //编写init()函数,并使用@PostConstruct注解标记工具类,初始化Bean
    @PostConstruct
    public void init(){
        oa7SystemUrl = this;
        oa7SystemUrl.oAResourcesConfiguration = this.oAResourcesConfiguration;
    }
 
    @Override
    public String getSystemUrl() {
        return oa7SystemUrl.oAResourcesConfiguration.getOaApiUrl();
    }
}

4. 使用方式

使用方式 oa7SystemUrl.oAResourcesConfiguration 获取方法

@Component //使用@Component注解标记工具类
public class Oa7SystemUrlUtils implements SystemUrl {
 
    //使用@Autowired注入我们需要的Bean
    @Autowired
    OAResourcesConfiguration oAResourcesConfiguration;
 
    static Oa7SystemUrlUtils oa7SystemUrl;
 
    //编写init()函数,并使用@PostConstruct注解标记工具类,初始化Bean
    @PostConstruct
    public void init(){
        oa7SystemUrl = this;
        oa7SystemUrl.oAResourcesConfiguration = this.oAResourcesConfiguration;
    }
 
    //使用方式 oa7SystemUrl.oAResourcesConfiguration获取方法
    @Override
    public String getSystemUrl() {
        return oa7SystemUrl.oAResourcesConfiguration.getOaApiUrl();
    }
}

同样,我们在静态方法中调用依赖注入的 Bean 中的方法与上述例子类似,过程如下:

@Component
public class MyUtils {
 
    private static MyUtils  staticInstance = new MyUtils();
 
    @Autowired
    private MyMethorClassService myService;
 
    @PostConstruct
    public void init(){
        staticInstance.myService = myService;
    }
 
    public static Integer invokeBean(){
        return staticInstance.myService.add();
    }
}

扫描二维码关注公众号 : 猿码天地

你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。

——《写给程序员朋友》