共计 2966 个字符,预计需要花费 8 分钟才能阅读完成。
起源:blog.csdn.net/showchi/article/details/97005720
留神:调用者要被 spring 治理
形式一
注解 @PostConstruct
import com.example.javautilsproject.service.AutoMethodDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
/**
* springboot 静态方法获取 bean 的三种形式 (一)
* @author: clx
* @version: 1.1.0
*/
@Component
public class StaticMethodGetBean_1 {
@Autowired
private AutoMethodDemoService autoMethodDemoService;
@Autowired
private static AutoMethodDemoService staticAutoMethodDemoService;
@PostConstruct
public void init() {staticAutoMethodDemoService = autoMethodDemoService;}
public static String getAuthorizer() {return staticAutoMethodDemoService.test();
}
}
PostConstruct 正文用于在依赖关系注入实现之后须要执行的办法上,以执行任何初始化。此办法必须在将类放入服务之前调用。
反对依赖关系注入的所有类都必须反对此正文。即便类没有申请注入任何资源,用 PostConstruct 正文的办法也必须被调用。只有一个办法能够用此正文进行正文。
利用 PostConstruct 正文的办法必须恪守以下所有规范:
- 该办法不得有任何参数,除非是在 EJB 拦截器 (interceptor) 的状况下,依据 EJB 标准的定义,在这种状况下它将带有一个 InvocationContext 对象;
- 该办法的返回类型必须为 void;
- 该办法不得抛出已查看异样;
- 利用 PostConstruct 的办法能够是 public、protected、package private 或 private;
- 除了应用程序客户端之外,该办法不能是 static;
- 该办法能够是 final;
- 如果该办法抛出未查看异样,那么不得将类放入服务中,除非是可能解决异样并可从中复原的 EJB。
形式二
启动类 ApplicationContext
实现形式:在 springboot 的启动类中,定义 static 变量 ApplicationContext,利用容器的 getBean 办法取得依赖对象
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
* @author: clx
* @version: 1.1.0
*/
@SpringBootApplication
public class Application {
public static ConfigurableApplicationContext ac;
public static void main(String[] args) {ac = SpringApplication.run(Application.class, args);
}
}
调用形式
/**
* @author: clx
* @version: 1.1.0
*/
@RestController
public class TestController {
/**
* 形式二
*/
@GetMapping("test2")
public void method_2() {AutoMethodDemoService methodDemoService = Application.ac.getBean(AutoMethodDemoService.class);
String test2 = methodDemoService.test2();
System.out.println(test2);
}
}
形式三
手动注入 ApplicationContext
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
/**
* springboot 静态方法获取 bean 的三种形式 (三)
* @author: clx
* @version: 1.1.0
*/
@Component
public class StaticMethodGetBean_3<T> implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {StaticMethodGetBean_3.applicationContext = applicationContext;}
public static <T> T getBean(Class<T> clazz) {return applicationContext != null?applicationContext.getBean(clazz):null;
}
}
调用形式
/**
* 形式三
*/
@Test
public void method_3() {AutoMethodDemoService autoMethodDemoService = StaticMethodGetBean_3.getBean(AutoMethodDemoService.class);
String test3 = autoMethodDemoService.test3();
System.out.println(test3);
}
以上三种形式楼主都测试过能够为完满应用。
近期热文举荐:
1.1,000+ 道 Java 面试题及答案整顿 (2021 最新版)
2. 别在再满屏的 if/ else 了,试试策略模式,真香!!
3. 卧槽!Java 中的 xx ≠ null 是什么新语法?
4.Spring Boot 2.5 重磅公布,光明模式太炸了!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!
正文完