spring装配bean有几种方式?

2021-02-19 18:19

阅读:402

标签:reading   imp   wired   使用   public   生产   XML   ase   unit   

一 前言

  1. 在XML中进行显式配置。
  2. 在Java中进行显式配置。
  3. 隐式的bean发现机制和自动装配

关于xml配置不会在本篇说明,有兴趣的读者可以自行了解学习;

知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

二 自动装配bean

自动装配Bean主要通过如下两个方式实现自动装备bean

  1. 组件扫描(component scanning):Spring会自动扫描发现上下文中所创建的bean;对应java配置@ComponentScan注解,其会默认会扫描与配置类相同的包和其子包;如果是xml就是
  2. 自动装配(autowiring):Spring自动化管理bean之间的依赖关系;java配置@Autowiring注解,相当于java规范中的@Inject注解;其可以使用在任何类的任何方法上;不建议将required属性设置为false,否则如果在bean未装配的情况下就会报空指针异常;
  3. @Component注解:赋予spring上下文组件类一个ID;如果不指定value默认就是将类名的第一个字母变为小写形式;其相当于java规范中的@Name注解;

敲黑板了

理下思路我们可以通过@Component注解使用在多个类上实现多个bean;然后通过@Autowiring使用在方法上实现bean之间的依赖注入;最后通过@ComponentScan将所有bean扫入spring应用上下文;当然里面还有许多使用的小细节,要不然很容易出错;

实现如下

2.1 棉被类

/**
 * @Author lsc
 * 

棉被

*/ @Component public class Quilt { // 质量 private String quality; public void product(){ System.out.println("生产与中国"); } // 省略set/get }

2.2 被单类

/**
 * @Author lsc
 * 

被单

*/ @Component//相当于@Component("sheet") public class Sheet { // 颜色 private String color; // 长度 private String length; private Quilt quilt; // 使用构造器注入方式将Quilt注入到Sheet,你也可以使用set方式;原则上还可以其它方法 public Sheet(Quilt quilt){ this.quilt = quilt; } // 省略set/get }

2.3被单配置类

/**
 * @Author lsc
 * 

被单配置类

*/ @Configuration//告诉spring这是一个配置类 @ComponentScan//这边的包是com.zszxz.auto 相当于@ComponentScan(basePackages = {"com.zszxz.auto"}) public class SheetConfig { }

2.4 测试类

/**
 * @Author lsc
 * 

*/ @RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文 @ContextConfiguration(classes= SheetConfig.class)//加载配置类 public class SheetTest { @Autowired Sheet sheet; @Test public void sheetTest(){ // 生产与中国 sheet.getQuilt().product(); } }

三 java配置

java配置只需要通过如下注解即可完成,通常使用在引入第三方类时;

  1. @Configuration注解:告诉spring这是一个配置类
  2. @Bean注解:告诉spring这是一个bean,使用在方法上,默认bean的名称就是方法名也就是前面提到的bean的ID;

思路:@Configuration注解声明的配置类中使用注解@Bean,就实现了java配置;

3.1 棉类

/**
 * @Author lsc
 * 

*/ public class Cotton { // 质量 private String quality; public void product(){ System.out.println("cotton生产与中国"); } // 省略set/get }

3.2 毛毯

/**
 * @Author lsc
 * 

毛毯

*/ public class Blanket { // 颜色 private String color; // 长度 private String length; // 构造器注入 private Cotton cotton; @Autowired public Blanket(Cotton cotton){ this.cotton = cotton; } // 省略set/get }

3.3 毛毯配置类

/**
 * @Author lsc
 * 

毛毯配置类

*/ @Configuration//告诉spring这是一个配置类,spring会扫描其所有配置纳入spring容器 public class BlanketConfig { // 将Cotton注入到spring应用上下文 @Bean public Cotton cotton(){ return new Cotton(); } // 将 Cotton注入到Blanket注入到spring应用上下文 @Bean public Blanket blanket(Cotton cotton){ return new Blanket(cotton); } }

3.4 测试类

/**
 * @Author lsc
 * 

*/ @RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文 @ContextConfiguration(classes= BlanketConfig.class)//加载配置类 public class BlanketTest { @Autowired Blanket blanket; @Test public void sheetTest(){ // cotton生产与中国 blanket.getCotton().product(); } }

四 配置结合

使用 @Import 注解能将一个配置类导入另一个配置类, 通常用来合并配置类,下面的示例使用方式更加优雅;

使用示例

/**
 * @Author lsc
 * 

*/ @Configuration @Import({SheetConfig.class, BlanketConfig.class}) public class MergeConfig { }

测试示例

/**
 * @Author lsc
 * 

*/ @RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文 @ContextConfiguration(classes= MergeConfig.class)//加载配置类 public class MergeTest { @Autowired Blanket blanket; @Test public void sheetTest(){ // cotton生产与中国 blanket.getCotton().product(); } }

更多精彩原创内容关注公众号:知识追寻者

spring装配bean有几种方式?

标签:reading   imp   wired   使用   public   生产   XML   ase   unit   

原文地址:https://www.cnblogs.com/zszxz/p/12684496.html


评论


亲,登录后才可以留言!