当前位置: 首页 > 后端技术 > Java

SpringBoot引入第三方jarbean的三种方式

时间:2023-04-01 20:42:49 Java

在SpringBoot环境下,以前的xml配置bean用的很少,主要是这种方式不好维护,不够方便。因此,本篇博文不再介绍Spring中通过xml声明bean的方式。1、注解assemblyBean1,使用@Component等派生注解,只需在类上加上@Component注解,只要扫描到该注解就会注入到springbean容器中。@ComponentpublicclassAnoDemoBean{}当然不仅仅是@Component注解可以声明Bean,也可以使用常见的注解如:@Repository、@Service、@Controller等。查看这些注解,会发现在这些注解中添加了@Component注解@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Component//可以看到添加了@Service注解@Component、@Repository和@Controller也一样。public@interfaceService{@AliasFor(annotation=Component.class)Stringvalue()default"";}这一系列注解的出现给我们带来了极大的方便。我们不需要像以前那样在bean.xml文件中配置bean。现在我们可以通过在类中添加相关的注解来轻松完成bean的定义。这四个注解在功能上其实没有什么特别的区别,只是业界有个不成文的约定:Controller一般用在控制层Service一般用在业务层Repository一般用在数据层Component一般用公共组件中使用2.@Bean定义方法该方法主要是结合Configuration定义bean。首先声明一个配置类,然后在配置类中,以返回bean对象的方法的形式声明bean。通常,姿势如下}}需要注意的是,BeanLoadConfig类本身也被Spring容器视为一个Bean。3、@ComponentVS@Bean1)作用的对象不同:@Component注解作用于类,而@Bean注解作用于方法。这样的特性将使@Bean方法更加灵活。比如当我们引用第三方库中的类,需要将其组装到Spring容器中时,只能通过@Bean来实现。例如@ConfigurationpublicclassWireThirdLibClass{@BeanpublicThirdLibClassgetThirdLibClass(){//第三方ThirdLibClass类returnnewThirdLibClass();}}另一个例子是@BeanpublicOneServicegetService(status){case(status){when1:returnnewserviceImpl1();当2:返回新的serviceImpl2();当3:returnnewserviceImpl3();}}这两点都是@Component无法实现的,只能通过@Bean来实现,所以@Bean更加灵活。2)@Component通常通过类路径扫描自动组装到Spring容器中。而@Bean通常我们在注解的方法中定义生成这个bean的逻辑。我们可以添加一些@Conditional、@ConditionalOnBean等注解来控制是否声明Bean,不会一开始就自动组装到Spring容器中。例如publicclassMacConditionimplementsCondition{@Overridepublicbooleanmatches(ConditionContextconditionContext,AnnotatedTypeMetadataannotatedTypeMetadata){Environmentenvironment=conditionContext.getEnvironment();Stringproperty=environment.getProperty("os.name");if(property.contains("Mac")){log.info("当前操作系统是:MacOSX");返回真;}返回假;}}@ConfigurationpublicclassConditionalConfig{/***如果MacCondition的实现方法返回true,则注入这个bean*/@Bean("mac")@Conditional({MacCondition.class})publicSystemBeansystemMac(){log.info("ConditionalConfig方法注入mac实体");returnnewSystemBean("Macios系统","001");}}上面例子的意思是如果当前操作系统是Mac,则注入当前Bean。这只能通过@Bean注解来实现。总结:@Component和@Bean都是用来注册Bean并组装到Spring容器中的,但是Beans比Components更具有可定制性。可以实现一些Component无法实现的自定义加载类。2.导入外部jar包的Bean。如果在当前项目中添加上述注解,当SpingBoot主类启动时,@SpringBootApplication注解会默认扫描本包及其子包中所有需要组装的类,并自动组装。到弹簧豆容器。但是如果你给第三方用户提供了一个Jar包,那么你的jar包里面的bean是不是可以被第三方加载呢?取决于你当前项目的包名和你引用的第三方Jar包的包名。如果你当前项目包的地址是com.jincou,你引用的第三方Jar的包是com.third,那么第三方Jar的Bean是扫描不到的,也就无法注入到Spring容器中.比如这里有一个第三方Bean。怎么才能扫描到注入到Spring容器中。packagecom.third.bean;importorg.springframework.stereotype.Component;/***@Description:这个bean作为依赖jar包的项目的第三方bean*/@ComponentpublicclassThirdComponentBean{privateStringtype="Part三方ThirdComponent注解生成bean实体";}1.@ComponentScan很简单。既然@SpringBootApplication注解默认只扫描当前项目的当前包及其子包,那就想办法让它扫描第三方jar包。/***@Description:Springboot启动类*/@ComponentScan(basePackages={"com.third.bean"})@SpringBootApplication()publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(应用程序类);}}@ComponentScan主要是定义扫描路径找出需要组装的类并自动组装到springbean容器中。需要组装的类是@Controller、@Service、@Repository、@Component、@Configuration等注解的Bean到IOC容器中。这里不一定要加到启动类中,可以加到组装类中,但是建议加到启动类中,更直观,如果要改也更容易找到或稍后将其删除。2、@Import注解@ComponentScan扫描整个包,但实际上你可能只需要注入一个或几个指定的bean,这时我们可以考虑使用@Import注解@Import(value=com.third.bean.ThirdComponentBean.class)@SpringBootApplication()publicclassApplication{publicstaticvoidmain(String[]args){SpringApplication.run(Application.class);这样做也会成功地将ThirdComponentBean对象注入到Spring的bean容器中。3、上面两种spring.factories的注入方式有一个明显的缺点,就是如果我需要引用外部jar包的Bean,需要在当前项目中配置@ComponentScan或者@Import进行扫描注入现在的Bean,显然不够友好。当前项目能不能什么都不做,直接引用第三方jar的Bean?当然。我们只需要将配置放在第三方jar指定的文件中,用户会自动加载,避免代码的侵入。在resource目录下新建目录META-INF,在META-INF目录下新建文件spring.factories在文件中添加如下配置:org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.third.bean.ConfigurationBean完整项目相关demo项目已经放在gitHub上,这里同时创建了两个项目create-bean和third-beanthird-bean作为第三方jar包被create-bean引用,相关测试可以在此演示中执行。GitHub项目源码:https://github.com/yudiandemi...本文由多篇博文平台OpenWrite发布!