第三方jar包对象注入到Bean容器

第三方jar包的对象往往都不会自带@Service、@Component或者其他,但是我们需要让这些对象启动时就注入到Spring容器中,这就需要使用@Bean注解来实现

常用做法:

@Bean语法

@Configuration
public class CommonConfig{
  @Bean
  public Country country(){
    return new Country();
  }
  
  @Bean
  public Province province(Country country){
    System.out.println(country);
    return new Province();
  }
}

//测试

public static void main(String[] args) {
  ApplicationContext context = SpringApplication.run(SpringBootTestApplication.class, args);
  Country country = context.getBean(Country.Class);
  System.out.println(country);
}

如果方法的内部需要使用ioc容器中已经存在的Bean对象,只需要在方法中指定入参即可,Spring会自动注入

@Import语法

在Spring的启动类上添加@Import注解,可以指定配置类加载到Spring容器中

@Import(CommonConfig.class)//多个配置类用逗号分隔
@SpringBootApplication
public class SpringBootRegistApplication{
  SpringApplication.run(SpringBootTestApplication.class, args);
}

思考:当配置类多的时候,SpringBoot既然是为了解决项目臃肿问题,是否有更好的方式来优雅的实现

方式1:实现ImportSelector接口

public class CommonImportSelector implements ImportSelector{
  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata){
    return new String[]{"com.squirtle.test.config.CommonConfig","..."};//有多少个配置类,就在String数组里面加入多少个
  }
}
@Import(CommonImportSelector.class)
@SpringBootApplication
public class SpringBootRegistApplication{
  SpringApplication.run(SpringBootTestApplication.class, args);
}

方式2:使用配置文件+ImportSelector方式

一行表示一个配置类

com.squirtle.test.config.CommonConfig
xxx.xxxx.xxxx.xxx.xxx
xxx.xxx.xxx.xxx.xxx
public class CommonImportSelector implements ImportSelector{
  @Override
  public String[] selectImports(AnnotationMetadata importingClassMetadata){
    List<String> imports = new ArrayList<>();
    InputStream is = CommonImportSelector.class.getClassLoader().getResourceAsStream("common.imports");
    BufferedReader br = new BufferedReader(new InputStreamReader(is));
    String line = null;
    try{
      while((line=br.readLine()) != null){
        imports.add(line);
      }
    }catch(IOException e){
      throw new RuntimeException(e);
    }finally{
      if(br != null){
        try{
          br.close();
        }catch(IOException e){
          throw new RuntimeException(e);
        }
      }
    }
    return imports.toArray(new String[0])
  }
}

想要更优雅,则可以自定义注解,无需在SpringBoot启动类上指定包路径了

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(CommonImportSelector.class)
public @interface EnableCommonConfig{
}
@EnableCommonConfig
@SpringBootApplication
public class SpringBootRegistApplication{
  SpringApplication.run(SpringBootTestApplication.class, args);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
@Bean注解是Spring Framework中的一个注解,用于在Java配置文件中声明bean。通过使用@Bean注解,我们可以将第三方库中的bean加入到Spring应用程序上下文中进行管理。 具体来说,我们可以在@Configuration类中使用@Bean注解来声明一个方法,该方法返回一个对象,Spring容器会将该对象作为bean添加到应用程序上下文中。这个方法可以返回任何一个Java对象,包括第三方库中的对象。 例如,我们想要将第三方库中的一个类的实例化对象添加到Spring应用程序上下文中,可以按照以下步骤操作: 1. 导入第三方库的jar包到项目中; 2. 在@Configuration类中声明一个@Bean注解的方法,该方法返回第三方库中的类的实例化对象; 3. 在需要使用该对象的地方注入bean。 例如,假设我们要使用Google Guava库中的CacheBuilder类创建一个缓存对象并将其添加到Spring应用程序上下文中,我们可以编写以下代码: ```java @Configuration public class AppConfig { @Bean public Cache<String, Object> cache() { return CacheBuilder.newBuilder() .expireAfterWrite(10, TimeUnit.SECONDS) .maximumSize(1000) .build(); } } ``` 然后,在需要使用该缓存的地方,我们可以将其注入到目标类中: ```java @Service public class MyService { @Autowired private Cache<String, Object> cache; // ... } ``` 这样,我们就可以使用Google Guava库中的CacheBuilder类创建的缓存对象,并将其纳入Spring应用程序上下文的管理之下。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carl·杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值