在典型的SpringBoot 环境中,很少使用遗留的XML 配置bean。主要原因是这种方式维护困难,不够方便。
Springboto主要通过以下方式注入bean: Bean分为本地服务工程注解声明的Bean和外部依赖包中的Bean。
一、 springboot装配本地服务工程中的bean
1、注解装配Bean
1. 对组件、服务、控制器、存储库等使用派生注释。
只要在你的类中添加@Component注解,只要扫描到该注解,就会将其注入到Spring bean容器中。
@成分
公共类AnoDemoBean {
}
当然,@Component注解并不是声明bean的唯一方式;您还可以使用常见的注解,例如:@Repository、@Service和@Controller。
如果您查看这些注释,您会发现它们本身是用@Component 注释的。
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@记录
@Component //可以看到@Service注解中添加了@Component,类似于@Repository和@Controller。
公共@接口服务{
@AliasFor(
注释=组件.类
)
字符串值()默认\’\’;
}
这一系列注解的出现给我们带来了很大的便利。您不再需要像以前一样在bean.xml 文件中配置bean;现在只需将相关注释添加到您的类即可完成bean 定义。
实际上,这四种注解的功能并没有什么特别的区别,只是业界有一个不成文的约定。
控制器通常用于控制层服务。通常用于数据层存储库。通常用在公共组件中。
2、@Bean定义方式
该方法主要与Configuration结合使用来定义bean。接下来,以返回bean 对象的方法的形式在Configuration 类中声明bean。通常采用以下姿势:
@数据
公共类ConfigDemoBean {
}
@作品
公共类BeanLoadConfig {
@豆子
公共ConfigDemoBean configDemoBean() {
返回一个新的ConfigDemoBean()。
}
}
需要说明的是,BeanLoadConfig 类本身也被Spring 容器视为一个bean。
3、Component注解 VS Bean注解
1)对象不同:@Component注解作用于类,@Bean注解作用于方法。
@Bean方法更加灵活。例如,如果引用第三方库中的类并需要将其组装到Spring容器中,则只能通过@Bean来实现。
例如
@作品
公共类WireThirdLibClass {
@豆子
公共ThirdLibClass getThirdLibClass() {
//第三方ThirdLibClass类
返回一个新的ThirdLibClass()。
}
}
另一个例子
@豆子
公共OneService getService(状态) {
案例(状态){
当1:
返回新的serviceImpl1();
当2:
返回新的serviceImpl2();
当3:
返回新的serviceImpl3();
}
}
这两点用@Component都无法实现,只能用@Bean来实现,所以@Bean更加灵活。
2)@Component通常通过类路径扫描自动组装到Spring容器中。 @Bean 通常定义在带注释的方法中创建此bean 的逻辑。
可以添加@Conditional、@ConditionalOnBean等注解来控制bean是否被声明,并阻止它从一开始就被自动组装到Spring容器中。
例如
公共类MacCondition 实现Condition {;
@覆盖
公共布尔匹配(ConditionContextconditionContext,AnnotatedTypeMetadata annotatedTypeMetadata){
环境环境=conditionContext.getEnvironment();
字符串属性=environment.getProperty(\’os.name\’);
if (property.contains(\’Mac\’)) {
log.info(\’当前操作系统是:Mac OS X\’);
返回真。
}
返回假。
}
}
@作品
公共类条件配置{
/**
* 如果MacCondition 的实现方法返回true,则注入此bean
*/
@Bean(\’Mac\’)
@Conditional({MacCondition.class})
公共SystemBean systemMac() {
log.info(\’ConditionalConfig方法插入Mac实体\’);
return new SystemBean(\’Mac ios 系统\’,\’001\’);
}
}
上面的例子表明,只有当前操作系统是Mac时,才会注入当前的bean。这只能使用@Bean注解来实现。
总结:@Component 和@Bean 都是用来注册和组装bean 到Spring 容器中的,但是bean 比组件更具可定制性。您可以实现一些组件无法实现的自定义加载类。
二、springboot装配依赖包中的bean
当SpingBoot的主类启动时,@SpringBootApplication注解默认会扫描自己的包路径及其子包路径下所有需要组装的类,并自动将它们放入Spring bean容器中。
但是如果你提供一个Jar包给第三方用户使用,他们能加载那个jar里面的bean吗?
这取决于当前项目的包名与您引用的第三方Jar包的包名是否匹配。如果一致的话,可以直接加载第三方依赖包中的bean。如果不一致,则无法加载第三方依赖包中的bean。
例如,如果您当前的项目包地址是com.jincou,引用的第三方Jar的包也是com.jincou,那么您可以扫描第三方Jar中的bean并将其注入到Spring中。容器。如果您当前的项目包地址是com.jincou,而您引用的第三方Jar的包是com.third,则无法扫描第三方Jar中的bean,因此无法注入到Spring中。容器。
例如,这里我们有一个第三方bean。如何扫描并能够注入到Spring 容器中。
包com.third.bean;
导入org.springframework.stereotype.Component。
/**
* @Description: 该bean在依赖jar包的项目中作为第三方bean使用。
*/
@成分
公共类ThirdComponentBean {
private String type=\’第三方ThirdComponent注解生成bean实体\’;
}
1、ComponentScan注解
@SpringBootApplication注解默认扫描的只是当前项目的包及其子包,所以我们只要想办法能够扫描第三方jar包就可以了。
/**
* @Description: Springboot启动类
*/
@ComponentScan(basePackages={\’com.third.bean\’})
@SpringBootApplication()
公开课申请{
公共静态无效主(字符串[] args){
SpringApplication.run(Application.class);
}
}
@ComponentScan主要定义了一个扫描路径,用于查找需要组装的类,并自动将其组装到Spring Bean容器中。
需要组装的类是带有@Controller、@Service、@Repository、@Component、@Configuration等注解的bean,添加到IOC容器中。
这里不需要将其添加到启动类中,您可以将其添加到已添加到程序集中的类中,但如果要更改它,将其添加到启动类中更直观且更容易找到。或者稍后删除。
2、Import注解
@ComponentScan扫描整个包,但实际上可能只需要注入一个或几个指定的bean。在这种情况下,您可以考虑使用@Import注释。
@Import(值=com.third.bean.ThirdComponentBean.class)
@SpringBootApplication()
公开课申请{
公共静态无效主(字符串[] args){
SpringApplication.run(Application.class);
}
}
这样,ThirdComponentBean 对象也将成功注入到Spring Bean 容器中。
3、spring.factories文件中配置bean
上述两种注入方法都有明显的缺点。这意味着如果需要引用外部jar包中的bean,需要在当前项目中设置@ComponentScan或@Import来扫描注入当前的bean。不够友好。
我当前的项目可以直接引用第三方jar中的bean而不做任何事情吗?
当然。
只需将配置放在第三方jar指定的文件中,用户就会自动加载它,以避免代码入侵。
在resources目录下新建目录META-INF。
在META-INF 目录中创建一个新文件spring.factories。
在文件中添加以下配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.third.bean.ConfigurationBean
以上关于如何用#springboot加载和注入bean的相关内容来源网络,仅供参考。相关信息请参见官方公告。
原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92064.html