1 控制反转
1.1 什么是控制反转
控制反转(ioc)是一种设计原则,它将对象的创建、依赖注入和生命周期管理等责任从应用程序代码中转移到框架或容器中
1.2 springboot中的控制反转
spring框架通过ioc容器来管理bean的生命周期和依赖关系,从而实现控制反转
2 ioc容器对bean的管理
2.1 什么是bean对象?
在spring框架中,bean是一个由spring ioc容器管理的对象。bean的创建、初始化、依赖注入以及销毁都由spring容器负责。bean可以是任何java对象,通常是一个pojo(plain old java object)。
2.2 bean的注册过程
2.2.1 扫描bean
- 在spring应用中,手动配置每个bean会非常繁琐,尤其是在大型项目中。@componentscan通过自动扫描和注册bean,简化了这一过程,使开发者能够专注于业务逻辑。
- 在spring boot应用中,@componentscan通常与@springbootapplication注解一起使用。@springbootapplication注解包含了@componentscan,默认会扫描主类所在包及其子包。
- 下面例子中,spring会扫描com.example.service和com.example.repository包及其子包下的所有组件。
@configuration @componentscan(basepackages = {"com.example.service", "com.example.repository"}) public class appconfig { }
2.2.2 定义bean
使用@component及其派生注解:spring支持通过@componentscan自动扫描并注册bean。常用的注解包括:
@component:通用注解,用于标记任意类为 bean。 @service:用于标记服务层的类。 @repository:用于标记数据访问层的类。 @controller:用于标记控制器层的类。 @configuration:用于标记配置类。
使用@bean注解:在配置类中,可以使用@bean注解显式定义bean。@bean通常用于定义第三方库中的类或需要自定义配置的bean。
@configuration// 配置注解 public class commonconfig { /** * @bean注解标注的方法会被 spring容器调用,并将返回值注册为一个 bean */ @bean public country country(){ return new country(); } /** * 默认情况下,bean 的名称是方法名。你可以通过name或value属性指定bean的名称。 */ @bean(name = "customservice") public myservice myservice() { //bean 的名称为 customservice,而不是默认的 myservice。 return new myservice(); } }
3.基于 xml 配置的注册:早期的 spring 版本中,bean 通常通过 xml 配置文件注册。虽然现在推荐使用注解,但 xml 配置仍然支持
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 注册一个 bean --> <bean id="myservice" class="com.example.myservice"/> </beans>
条件化的 bean 注册:可以结合条件注解(如 @conditionalonproperty、@conditionalonclass 等)实现条件化的 bean 注册
commonconfig.java
@configuration public class commonconfig { /** * 使用@conditionalonproperty 条件注入:配置文件中前缀是province,属性名为name的值若是wfs,则声明此bean * @conditionalonmissingbean 当不存在当前类型的bean时,才声明该bean * @conditionalonclass 当classpath下存在指定类时,才声明该bean */ @conditionalonproperty(prefix = "province",name = "name" ,havingvalue = "wfs") @conditionalonmissingbean @conditionalonclass(name = "com.wfs.config.commonconfig") public province province(@value("${province.name}") string name, @value("${province.direction}") string direction) { province province = new province(); province.setname(name); province.setdirection(direction); return province; } }
2.3 @import注解
@import注解用于将其他配置类或组件引入到当前配置类中。它提供了一种模块化的方式来组织spring应用的配置,避免将所有配置集中在一个类中。优先使用@componentscan:如果可以通过@componentscan扫描到的类,尽量使用@componentscan而不是@import。如下面的例子:
启动类
/* 1@import 可以标注在 @configuration 类或 @component 类上,用于导入其他配置类或组件类 2@import 可以同时导入多个配置类。 3@import 还可以导入实现了 importselector 接口的类,用于动态选择需要导入的配置类或组件类 */ @import(com.wfs.config.commonimportseletor.class)//使用@import导入importselector //@import(com.wfs.config.commonconfig.class) @springbootapplication public class springbootbeanregisterapplication { public static void main(string[] args) { applicationcontext context = springapplication.run(springbootbeanregisterapplication.class, args);//获取ioc容器 country country = context.getbean(country.class);//获取bean system.out.println(country); system.out.println(context.getbean("aa"));
commonimportseletor.java
/** * @importselector:导入选择器 * 作用:导入指定配置类 */ public class commonimportseletor implements importselector { @override public string[] selectimports(annotationmetadata importingclassmetadata) { return new string[]{"com.wfs.config.commonconfig"}; } }
2.4 bean的注册顺序
- 配置类:优先处理 @configuration 类。
- 组件类:扫描并注册带有 @component 及其衍生注解的类。
- 手动注册的 bean:处理 @bean 注解定义的 bean。
2.5 bean的依赖注入
构造器注入:推荐的方式,适用于强制依赖。
@service public class myservice { private final myrepository repository; @autowired public myservice(myrepository repository) { this.repository = repository; } }
setter 注入:适用于可选依赖
@service public class myservice { private myrepository repository; @autowired public void setrepository(myrepository repository) { this.repository = repository; } }
字段注入:不推荐,因为不利于测试和代码可读性。
@service public class myservice { @autowired private myrepository repository; }
到此这篇关于springboot控制反转与bean对象的文章就介绍到这了,更多相关springboot控制反转内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论