Springboot 中如果希望在 Utils 工具类中,使用到我们已经定义过的 Dao 层或者 Service 层 Bean,可以如下编写 Utils 类:
-
使用 @Component 注解标记工具类
-
使用 @Autowired(@Autowired 和 @Resource 的区别不再介绍) 注入我们需要的 Bean
-
在工具类中编写 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();
}
}
扫描二维码关注公众号 : 猿码天地
你多学一样本事,就少说一句求人的话,现在的努力,是为了以后的不求别人,实力是最强的底气。记住,活着不是靠泪水博得同情,而是靠汗水赢得掌声。
——《写给程序员朋友》