SpringBoot中static方法中使用Autowired

本文详细介绍了如何在Spring框架中使用单例模式和applicationContext.getBean方法来实现在静态方法中注入并获取Bean实例的过程。通过线程安全的懒汉式单例模式,确保了在多线程环境下获取Bean的线程安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候我们需要在static公共方法中使用@Autowired,

解决方案:

使用 applicationContext.getBean(BaseBizClient.class)的方法

  1. 获取Util的instance,单例模式
//线程安全 懒汉单例
  public static synchronized DealerGetUtil getInstance() {
      if (null == instance) {
          instance = new DealerGetUtil();
      }
      return instance;
  }
  1. 获取 applicationContext
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    if (DealerGetUtil.applicationContext == null) {
        DealerGetUtil.applicationContext = applicationContext; //初始化 spring applicationContext
    }
}
  1. 创建获取Bean方法:
//注入对象BaseBizClient
private synchronized BaseBizClient getBaseBizClient() {
    if (baseBizClient == null) {
        baseBizClient = applicationContext.getBean(BaseBizClient.class);
    }
    return baseBizClient;
}

完整代码

/**
 * Created by Youdmeng on 2018/7/17 0017.
 */
@Component
@EnableFeignClients
public class DealerGetUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext = null;

    private BaseBizClient baseBizClient;
    
    private static DealerGetUtil instance;

    private DealerGetUtil() {
    }

    //线程安全 懒汉单例
    public static synchronized DealerGetUtil getInstance() {
        if (null == instance) {
            instance = new DealerGetUtil();
        }
        return instance;
    }

    /**
     *
     * @param userVO
     * @return
     * @throws Exception
     */
    public String getDealer(UserVO userVO) throws Exception {
        String dealerId = "";
        //获取员工
        UserPageResponseVO userPageResponseVO = getBaseBizClient().getUser(SysConstant.SYSTEM.toString(), userVO.getUserId()).getData();

        return "";
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        if (DealerGetUtil.applicationContext == null) {
            DealerGetUtil.applicationContext = applicationContext; //初始化 spring applicationContext
        }
    }

    //注入对象BaseBizClient
    private synchronized BaseBizClient getBaseBizClient() {
        if (baseBizClient == null) {
            baseBizClient = applicationContext.getBean(BaseBizClient.class);
        }
        return baseBizClient;
    
}





更多好玩好看的内容,欢迎到我的博客交流,共同进步        WaterMin


<think>好的,用户想知道如何在Java方法中集成和使用Spring Boot功能。首先,我需要回忆Spring Boot的基本概念和核心功能。Spring Boot简化了基于Spring的应用开发,通过自动配置和起步依赖减少了配置的复杂性。用户可能已经知道这些,但需要具体的集成步骤。 接下来,我应该考虑用户可能的场景。他们可能正在开发一个Web应用,或者需要集成数据库、安全等功能。根据提供的引用,用户提到了Spring Web、Spring Data JPA以及Spring Security的依赖添加,这些是常见的集成点。需要分步骤说明如何在项目中添加这些依赖,并配置相应的功能。 然后,关于Java方法使用Spring Boot功能,可能需要解释如何通过注解如@Autowired进行依赖注入,或者使用@RestController创建REST接口。同时,需要提到Spring Boot的自动配置机制,比如如何通过application.properties文件配置数据库连接,这样在方法中可以直接使用JpaRepository而无需手动配置数据源。 还要考虑用户可能的疑问,比如如何确保依赖正确添加,如何处理常见的配置错误,或者如何扩展Spring Boot的功能。例如,引用中提到了使用Spring Initializr创建项目,这应该是推荐的起点,确保依赖选择正确。同时,引用2中关于Spring Security的依赖添加,可能需要说明如何启用安全功能,并在方法中进行权限控制。 需要结构化回答,先介绍创建项目,添加依赖,然后逐步讲解如何编写Controller、Service层,使用依赖注入,配置数据访问,以及集成安全模块。每个步骤要给出代码示例,并解释关键注解的作用,比如@SpringBootApplication、@Service、@Repository等。同时,要提到如何运行应用,并通过测试验证功能是否正常。 此外,用户可能对实际项目中的最佳实践感兴趣,比如如何组织项目结构,如何进行单元测试,或者如何监控应用。引用2提到了Spring Boot Admin的集成,这可能涉及到监控和管理应用的配置,可以作为扩展内容提及,但根据问题,可能重点在于基础功能的集成和使用。 最后,生成的相关问题需要围绕用户可能进一步探索的方向,比如依赖管理、自动配置原理、与其他框架的整合,或者如何处理事务管理等。确保问题覆盖用户后续可能遇到的挑战,帮助他们深入学习。</think>### 如何在 Java 方法中集成与使用 Spring Boot 功能 #### 1. **创建 Spring Boot 项目** - **使用 Spring Initializr**:通过 [start.spring.io](https://start.spring.io) 初始化项目,选择以下依赖: - `Spring Web`(构建 RESTful API) - `Spring Data JPA`(数据库操作) - `Spring Security`(鉴权管理)[^1][^2] - **项目结构**:生成的 `pom.xml` 会自动包含所选依赖,例如: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> ``` #### 2. **定义入口类** - **主类注解**:使用 `@SpringBootApplication` 启用自动配置: ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` #### 3. **编写业务逻辑** - **依赖注入**:通过 `@Autowired` 注入 Bean: ```java @Service public class UserService { @Autowired private UserRepository userRepository; // Spring Data JPA 接口 public User getUserById(Long id) { return userRepository.findById(id).orElse(null); } } ``` - **REST 接口**:使用 `@RestController` 定义 API: ```java @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/user/{id}") public User getUser(@PathVariable Long id) { return userService.getUserById(id); } } ``` #### 4. **配置数据源** - **`application.properties`**: ```properties spring.datasource.url=jdbc:mysql://localhost:3306/mydb spring.datasource.username=root spring.datasource.password=123456 spring.jpa.hibernate.ddl-auto=update ``` #### 5. **集成安全功能** - **添加 Spring Security 依赖**: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` - **配置鉴权规则**: ```java @Configuration public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .requestMatchers("/public/**").permitAll() .anyRequest().authenticated() .and().httpBasic(); return http.build(); } } ``` #### 6. **运行与测试** - 启动主类后,访问 `http://localhost:8080/user/1` 测试接口,Spring Security 会要求身份验证。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值