(四)、自动装配
什么是自动装配?
Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值
1.@Autowired 自动装配
/** * @Author Jsxs * @Date 2023/8/17 11:14 * @PackageName:com.jsxs.config * @ClassName: MainConfigOfAutowried * @Description: TODO * 自动装配: * Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值 * 1. @Autowired:自动注入 * 原理:假如我们service类需要用到dao类那么我们在service中声明 dao类为私有变量并加上@Autowired注解 * (1).那么默认按照类型去容器中找对应的组件: 好比如: applicationContext.getBean(BookMapper.class); 假如找到一个的话,那么就从IOC容器中取值并赋值 * (2).如果找到多个相同类型的组件,再将属性的名称作为的id去容器中查找。 比如: applicationContext.getBean("bookMapper") 通过具体组件名获取 * (3).如果想指定使用某一个同类型不同命的组件,那么需要使用 @Qualifier("book2") 进行指定需要的组件 * @Version 1.0 */
(1). 自动装配(原理是从IOC容器中获得值并赋值)
1.BookMapper.java
package com.jsxs.mapper; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; /** * @Author Jsxs * @Date 2023/8/12 9:39 * @PackageName:com.jsxs.Mapper * @ClassName: BookMapper * @Description: TODO * @Version 1.0 */ @Repository public class BookMapper { private String label="1"; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @Override public String toString() { return "BookMapper{" + "label='" + label + '\'' + '}'; } }
2.BookService.java
package com.jsxs.service; import com.jsxs.mapper.BookMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @Author Jsxs * @Date 2023/8/12 9:33 * @PackageName:com.jsxs.service * @ClassName: BookService * @Description: TODO * @Version 1.0 */ @Service public class BookService { // ⭐⭐ @Autowired private BookMapper bookMapper; public void print(){ System.out.println("1111111111111111111"+bookMapper); } @Override public String toString() { return "BookService{" + "bookMapper=" + bookMapper + '}'; } }
3.配置类的书写
package com.jsxs.config; import com.jsxs.mapper.BookMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * @Author Jsxs * @Date 2023/8/17 11:14 * @PackageName:com.jsxs.config * @ClassName: MainConfigOfAutowried * @Description: TODO * 自动装配: * Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值 * 1. @Autowired:自动注入 * 原理:假如我们service类需要用到dao类那么我们在service中声明 dao类为私有变量并加上@Autowired注解 * (1).那么默认按照类型去容器中找对应的组件: 好比如: applicationContext.getBean(BookMapper.class); 假如找到一个的话,那么就从IOC容器中取值并赋值 * (2).如果找到多个相同类型的组件,再将属性的名称作为的id去容器中查找。 applicationContext.getBean("bookMapper") * @Version 1.0 */ @Configuration @ComponentScan(value = "com.jsxs") // ⭐⭐ public class MainConfigOfAutowried { }
4.测试
package com.jsxs.Test; import com.jsxs.mapper.BookMapper; import com.jsxs.config.MainConfigOfAutowried; import com.jsxs.service.BookService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @Author Jsxs * @Date 2023/8/17 11:23 * @PackageName:com.jsxs.Test * @ClassName: IOCTest_Autowried * @Description: TODO * @Version 1.0 */ public class IOCTest_Autowried { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowried.class); for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) { System.out.println(beanDefinitionName); } // 判断我们是否是从IOC容器中获得值并赋值? BookMapper bean = applicationContext.getBean(BookMapper.class); BookService bean1 = applicationContext.getBean(BookService.class); System.out.println(bean1); System.out.println(bean); } }
(2).@AutoWried(先类型后属性名)
这里我们第一个组件通过 @Reposity 注解扫描注入IOC容器,然后第二个组件通过 @Bean 的方式注入IOC容器。所以在这里我们就会发现在同一个IOC容器中有两个相同类型但不同名
的组件。
1.BookMapper.java
package com.jsxs.mapper; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; /** * @Author Jsxs * @Date 2023/8/12 9:39 * @PackageName:com.jsxs.Mapper * @ClassName: BookMapper * @Description: TODO * @Version 1.0 */ // 组件1 @Repository public class BookMapper { private String label="1"; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @Override public String toString() { return "BookMapper{" + "label='" + label + '\'' + '}'; } }
2.BookService.java
package com.jsxs.service; import com.jsxs.mapper.BookMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** * @Author Jsxs * @Date 2023/8/12 9:33 * @PackageName:com.jsxs.service * @ClassName: BookService * @Description: TODO * @Version 1.0 */ @Service public class BookService { @Autowired private BookMapper bookMapper; public void print(){ System.out.println(bookMapper); } @Override public String toString() { return "BookService{" + "bookMapper=" + bookMapper + '}'; } }
3.配置类
package com.jsxs.config; import com.jsxs.mapper.BookMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * @Author Jsxs * @Date 2023/8/17 11:14 * @PackageName:com.jsxs.config * @ClassName: MainConfigOfAutowried * @Description: TODO * 自动装配: * Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值 * 1. @Autowired:自动注入 * 原理:假如我们service类需要用到dao类那么我们在service中声明 dao类为私有变量并加上@Autowired注解 * (1).那么默认按照类型去容器中找对应的组件: 好比如: applicationContext.getBean(BookMapper.class); 假如找到一个的话,那么就从IOC容器中取值并赋值 * (2).如果找到多个相同类型的组件,再将属性的名称作为的id去容器中查找。 applicationContext.getBean("bookMapper") * @Version 1.0 */ @Configuration @ComponentScan(value = "com.jsxs") public class MainConfigOfAutowried { // ⭐ 通过@Bena注入的同类型不同命组件 @Bean("book2") public BookMapper bookMapper() { BookMapper bookMapper = new BookMapper(); bookMapper.setLabel("2"); return bookMapper; } }
4.测试类
package com.jsxs.Test; import com.jsxs.mapper.BookMapper; import com.jsxs.config.MainConfigOfAutowried; import com.jsxs.service.BookService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @Author Jsxs * @Date 2023/8/17 11:23 * @PackageName:com.jsxs.Test * @ClassName: IOCTest_Autowried * @Description: TODO * @Version 1.0 */ public class IOCTest_Autowried { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowried.class); for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) { System.out.println(beanDefinitionName); } BookService bean1 = applicationContext.getBean(BookService.class); System.out.println(bean1); } }
证明在同一个IOC容器中有两个相同类型但不同名的组件。
(3).@Qualifier 配合 @AutoWried
假如我们注入一个组件并未指定他的组件名,那么组件名就会默认是 首字母小写的驼峰命名。所以使用这个组件的目的主要是为了解决 相同类型但不同组件名 的需求。
1.BookMapper.java
package com.jsxs.mapper; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; /** * @Author Jsxs * @Date 2023/8/12 9:39 * @PackageName:com.jsxs.Mapper * @ClassName: BookMapper * @Description: TODO * @Version 1.0 */ @Repository // ⭐组件一 public class BookMapper { private String label="1"; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @Override public String toString() { return "BookMapper{" + "label='" + label + '\'' + '}'; } }
2.BookService.java
package com.jsxs.service; import com.jsxs.mapper.BookMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; /** * @Author Jsxs * @Date 2023/8/12 9:33 * @PackageName:com.jsxs.service * @ClassName: BookService * @Description: TODO * @Version 1.0 */ @Service public class BookService { @Autowired // ⭐ 自动装配 @Qualifier("book2") // 指定名字 private BookMapper bookMapper; public void print(){ System.out.println(bookMapper); } @Override public String toString() { return "BookService{" + "bookMapper=" + bookMapper + '}'; } }
3.配置类
package com.jsxs.config; import com.jsxs.mapper.BookMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; /** * @Author Jsxs * @Date 2023/8/17 11:14 * @PackageName:com.jsxs.config * @ClassName: MainConfigOfAutowried * @Description: TODO * 自动装配: * Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值 * 1. @Autowired:自动注入 * 原理:假如我们service类需要用到dao类那么我们在service中声明 dao类为私有变量并加上@Autowired注解 * (1).那么默认按照类型去容器中找对应的组件: 好比如: applicationContext.getBean(BookMapper.class); 假如找到一个的话,那么就从IOC容器中取值并赋值 * (2).如果找到多个相同类型的组件,再将属性的名称作为的id去容器中查找。 比如: applicationContext.getBean("bookMapper") 通过具体组件名获取 * (3).如果想指定使用某一个同类型不同命的组件,那么需要使用 @Qualifier("book2") 进行指定需要的组件 * @Version 1.0 */ @Configuration @ComponentScan(value = "com.jsxs") // ⭐扫描 public class MainConfigOfAutowried { @Bean("book2") // ⭐⭐ 组件二 public BookMapper bookMapper() { BookMapper bookMapper = new BookMapper(); bookMapper.setLabel("2"); return bookMapper; } }
4.测试
package com.jsxs.Test; import com.jsxs.mapper.BookMapper; import com.jsxs.config.MainConfigOfAutowried; import com.jsxs.service.BookService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @Author Jsxs * @Date 2023/8/17 11:23 * @PackageName:com.jsxs.Test * @ClassName: IOCTest_Autowried * @Description: TODO * @Version 1.0 */ public class IOCTest_Autowried { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowried.class); for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) { System.out.println(beanDefinitionName); } BookService bean1 = applicationContext.getBean(BookService.class); System.out.println(bean1); } }
(4).@Primary 首选装配
常用于: 相同类型不同名的组件,然后相比于 @Quailfier() 的使用是 在使用组件的时候添加,@Primary是在组件创建的时候,就默认未首选装配。
1.BookMapper.java
package com.jsxs.mapper; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; /** * @Author Jsxs * @Date 2023/8/12 9:39 * @PackageName:com.jsxs.Mapper * @ClassName: BookMapper * @Description: TODO * @Version 1.0 */ @Repository public class BookMapper { private String label="1"; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @Override public String toString() { return "BookMapper{" + "label='" + label + '\'' + '}'; } }
2.BookService
package com.jsxs.service; import com.jsxs.mapper.BookMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; /** * @Author Jsxs * @Date 2023/8/12 9:33 * @PackageName:com.jsxs.service * @ClassName: BookService * @Description: TODO * @Version 1.0 */ @Service public class BookService { @Autowired // @Qualifier("book2") ⭐⭐ 这里我们不指定使用哪个具体名字的组件进行装配 private BookMapper bookMapper; public void print(){ System.out.println("1111111111111111111"+bookMapper); } @Override public String toString() { return "BookService{" + "bookMapper=" + bookMapper + '}'; }
3.配置类
package com.jsxs.config; import com.jsxs.mapper.BookMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; /** * @Author Jsxs * @Date 2023/8/17 11:14 * @PackageName:com.jsxs.config * @ClassName: MainConfigOfAutowried * @Description: TODO * 自动装配: * Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值 * 1. @Autowired:自动注入 * 原理:假如我们service类需要用到dao类那么我们在service中声明 dao类为私有变量并加上@Autowired注解 * (1).那么默认按照类型去容器中找对应的组件: 好比如: applicationContext.getBean(BookMapper.class); 假如找到一个的话,那么就从IOC容器中取值并赋值 * (2).如果找到多个相同类型的组件,再将属性的名称作为的id去容器中查找。 比如: applicationContext.getBean("bookMapper") 通过具体组件名获取 * (3).如果想指定使用某一个同类型不同命的组件,那么需要使用 @Qualifier("book2") 进行指定需要的组件 * (4).@Qualifier("book2")需要在使用的时候加入注解,比较繁琐,我们希望在注册组件的时候就作为首选组件 @Primary * @Version 1.0 */ @Configuration @ComponentScan(value = "com.jsxs") public class MainConfigOfAutowried { @Primary // ⭐⭐⭐ 组件在注册的时候,我们就指定使用这个组件进行装配 同类型不同组件命的组件 @Bean("book2") public BookMapper bookMapper() { BookMapper bookMapper = new BookMapper(); bookMapper.setLabel("2"); return bookMapper; } }
4.测试
package com.jsxs.Test; import com.jsxs.mapper.BookMapper; import com.jsxs.config.MainConfigOfAutowried; import com.jsxs.service.BookService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @Author Jsxs * @Date 2023/8/17 11:23 * @PackageName:com.jsxs.Test * @ClassName: IOCTest_Autowried * @Description: TODO * @Version 1.0 */ public class IOCTest_Autowried { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowried.class); for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) { System.out.println(beanDefinitionName); } BookService bean1 = applicationContext.getBean(BookService.class); System.out.println(bean1); } }
2.@Resource 和 @Inject [JSR标准]
Spring 还支持@Resource(JSR250) 和 @Inject(JSR330) [Java 规范]
(1).@Resource 自动装配
1.BookMapper.java
package com.jsxs.mapper; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; /** * @Author Jsxs * @Date 2023/8/12 9:39 * @PackageName:com.jsxs.Mapper * @ClassName: BookMapper * @Description: TODO * @Version 1.0 */ @Repository public class BookMapper { private String label="1"; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @Override public String toString() { return "BookMapper{" + "label='" + label + '\'' + '}'; } }
2.BookServer.java
package com.jsxs.service; import com.jsxs.mapper.BookMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * @Author Jsxs * @Date 2023/8/12 9:33 * @PackageName:com.jsxs.service * @ClassName: BookService * @Description: TODO * @Version 1.0 */ @Service public class BookService { // ⭐⭐假如需要指定具体的组件的话,我们需要添加name属性,如果不添加name属性的话,就默认按照变量名查找 applicationContext.getBean("bookMapper") @Resource(name = "book2") private BookMapper bookMapper; public void print(){ System.out.println("1111111111111111111"+bookMapper); } @Override public String toString() { return "BookService{" + "bookMapper=" + bookMapper + '}'; } }
3.配置类
package com.jsxs.config; import com.jsxs.mapper.BookMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; /** * @Author Jsxs * @Date 2023/8/17 11:14 * @PackageName:com.jsxs.config * @ClassName: MainConfigOfAutowried * @Description: TODO * 自动装配: * Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值 * 1. @Autowired:自动注入 * 原理:假如我们service类需要用到dao类那么我们在service中声明 dao类为私有变量并加上@Autowired注解 * (1).那么默认按照类型去容器中找对应的组件: 好比如: applicationContext.getBean(BookMapper.class); 假如找到一个的话,那么就从IOC容器中取值并赋值 * (2).如果找到多个相同类型的组件,再将属性的名称作为的id去容器中查找。 比如: applicationContext.getBean("bookMapper") 通过具体组件名获取 * (3).如果想指定使用某一个同类型不同命的组件,那么需要使用 @Qualifier("book2") 进行指定需要的组件 * (4).@Qualifier("book2")需要在使用的时候加入注解,比较繁琐,我们希望在注册组件的时候就作为首选组件 @Primary * * 2. @Resource: 自动注入 ⭐⭐ * (1).@Resource和@Autowried都可以对IOC容器的组件进行自动装配,但是@Autowried是按照组件的类型和名称进行自动装配的 * (2).@Resource不能支持@Primary和@Quailifer这两个注解 * 3. @Inject: 自动注入 * (1).能够支持@Primary和@Quailifer , 和 @Autowired一样 * (2).但是需要导入一个包 * @Version 1.0 */ @Configuration @ComponentScan(value = "com.jsxs") public class MainConfigOfAutowried { @Primary // ⭐⭐ 这个添加是没有用的,因为@Resource不支持 @Bean("book2") public BookMapper bookMapper() { BookMapper bookMapper = new BookMapper(); bookMapper.setLabel("2"); return bookMapper; } }
4.测试类
package com.jsxs.Test; import com.jsxs.mapper.BookMapper; import com.jsxs.config.MainConfigOfAutowried; import com.jsxs.service.BookService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @Author Jsxs * @Date 2023/8/17 11:23 * @PackageName:com.jsxs.Test * @ClassName: IOCTest_Autowried * @Description: TODO * @Version 1.0 */ public class IOCTest_Autowried { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowried.class); for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) { System.out.println(beanDefinitionName); } BookService bean1 = applicationContext.getBean(BookService.class); System.out.println(bean1); } }
(2).@Inject 自动装配
1.导入对应的 inject依赖
<dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency>
2.BookMapper.java
package com.jsxs.mapper; import org.springframework.stereotype.Component; import org.springframework.stereotype.Repository; /** * @Author Jsxs * @Date 2023/8/12 9:39 * @PackageName:com.jsxs.Mapper * @ClassName: BookMapper * @Description: TODO * @Version 1.0 */ @Repository public class BookMapper { private String label="1"; public String getLabel() { return label; } public void setLabel(String label) { this.label = label; } @Override public String toString() { return "BookMapper{" + "label='" + label + '\'' + '}'; } }
3.BookService.java
package com.jsxs.service; import com.jsxs.mapper.BookMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.inject.Inject; /** * @Author Jsxs * @Date 2023/8/12 9:33 * @PackageName:com.jsxs.service * @ClassName: BookService * @Description: TODO * @Version 1.0 */ @Service public class BookService { // @Inject 和 @Autowried 一模一样。 可以使用@Quailifer 和 @Primary ⭐⭐ @Inject private BookMapper bookMapper; public void print(){ System.out.println("1111111111111111111"+bookMapper); } @Override public String toString() { return "BookService{" + "bookMapper=" + bookMapper + '}'; } }
4.配置类
package com.jsxs.config; import com.jsxs.mapper.BookMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; /** * @Author Jsxs * @Date 2023/8/17 11:14 * @PackageName:com.jsxs.config * @ClassName: MainConfigOfAutowried * @Description: TODO * 自动装配: * Spring利用依赖注入(DI),完成对IOC容器中各个组件的依赖关系赋值 * 1. @Autowired:自动注入 * 原理:假如我们service类需要用到dao类那么我们在service中声明 dao类为私有变量并加上@Autowired注解 * (1).那么默认按照类型去容器中找对应的组件: 好比如: applicationContext.getBean(BookMapper.class); 假如找到一个的话,那么就从IOC容器中取值并赋值 * (2).如果找到多个相同类型的组件,再将属性的名称作为的id去容器中查找。 比如: applicationContext.getBean("bookMapper") 通过具体组件名获取 * (3).如果想指定使用某一个同类型不同命的组件,那么需要使用 @Qualifier("book2") 进行指定需要的组件 * (4).@Qualifier("book2")需要在使用的时候加入注解,比较繁琐,我们希望在注册组件的时候就作为首选组件 @Primary * * 2. @Resource: 自动注入 * (1).@Resource和@Autowried都可以对IOC容器的组件进行自动装配,但是@Autowried是按照组件的类型和名称进行自动装配的 * (2).@Resource不能支持@Primary和@Quailifer这两个注解 * 3. @Inject: 自动注入 ⭐⭐ * (1).能够支持@Primary和@Quailifer , 和 @Autowired一样 * (2).但是需要导入一个包 * @Version 1.0 */ @Configuration @ComponentScan(value = "com.jsxs") public class MainConfigOfAutowried { @Primary // ⭐⭐⭐ 可以使用 @Bean("book2") public BookMapper bookMapper() { BookMapper bookMapper = new BookMapper(); bookMapper.setLabel("2"); return bookMapper; } }
5.测试
package com.jsxs.Test; import com.jsxs.mapper.BookMapper; import com.jsxs.config.MainConfigOfAutowried; import com.jsxs.service.BookService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; /** * @Author Jsxs * @Date 2023/8/17 11:23 * @PackageName:com.jsxs.Test * @ClassName: IOCTest_Autowried * @Description: TODO * @Version 1.0 */ public class IOCTest_Autowried { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAutowried.class); for (String beanDefinitionName : applicationContext.getBeanDefinitionNames()) { System.out.println(beanDefinitionName); } BookService bean1 = applicationContext.getBean(BookService.class); System.out.println(bean1); } }
3.@Autowried自动装配原理
通过点击 @Autowried的源码,我们发现这个注解可以标注在构造器上
、方法上
等。
(1).标注在Set方法位置上
// 标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋值的操作。 // 方法使用的参数,自定义类型的参数的值是从IOC容器中获取, 比如说 我们启动IOC容器后,就会在IOC容器中找类型未 Car.class 类型的组件
如果需要自动装配的话,项目要求非要方法上的话,那么一定要优先选择 set 方法。
1. Car.java
package com.jsxs.bean; import org.springframework.stereotype.Repository; /** * @Author Jsxs * @Date 2023/8/14 17:12 * @PackageName:com.jsxs.bean * @ClassName: Car * @Description: TODO * @Version 1.0 */ @Repository ⭐ public class Car { public Car(){ System.out.println("Car Constructor ...."); } public void init(){ System.out.println("Car Init..."); } public void destroy(){ System.out.println("Car Destroy..."); } }
2.Boss.java
package com.jsxs.bean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; /** * @Author Jsxs * @Date 2023/8/17 17:34 * @PackageName:com.jsxs.bean * @ClassName: Boss * @Description: TODO * @Version 1.0 */ @Repository ⭐⭐ public class Boss { private Car car; public Boss(Car car) { this.car = car; } public Boss() { } public Car getCar() { return car; } @Autowired ⭐⭐⭐ // 标注在方法上,Spring容器创建当前对象,就会调用方法,完成赋值的操作。 // 方法使用的参数,自定义类型的参数的值是从IOC容器中获取, 比如说 我们启动IOC容器后,就会在IOC容器中找类型未 Car.class 类型的组件 public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Boss{" + "car=" + car + '}'; } }
3.配置类
package com.jsxs.config; import com.jsxs.mapper.BookMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; /** * @Author Jsxs * @Date 2023/8/17 11:14 * @PackageName:com.jsxs.config * @ClassName: MainConfigOfAutowried * @Description: TODO **/ @Configuration @ComponentScan(value = "com.jsxs") //⭐⭐⭐ 扫描 public class MainConfigOfAutowried { @Primary @Bean("book2") public BookMapper bookMapper() { BookMapper bookMapper = new BookMapper(); bookMapper.setLabel("2"); return bookMapper; } }