关于java:Spring-Boot-获取-bean-的-3-种方式还有谁不会

起源: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开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理