码迷,mamicode.com
首页 > 其他好文 > 详细

02-三种Bean装配机制(一)

时间:2019-07-03 00:45:53      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:his   pointer   inter   rand   自动装配   point   oid   packages   int   

  Spring要创建哪些bean并且如何将其装配在一起,现有的,主要是三种装配机制:

  • 自动化装配
  • 通过java代码装配
  • 通过XML装配

  这三种装配机制可以互相搭配使用,即是可以共存的。接下来就分别介绍啦????。。。。。

  1. 自动化装配

    1)@ComponentScan

      该注解意为启用组件扫描,使用方式如下:

@Configuration
@ComponentScan
public class Car {}

  上面这种,没有为@ComponentScan设置任何属性,Spring将会按照默认规则,以配置类所在的包作为基础包(base package)来扫描组件。如果想自己指定扫描某个包可以吗?答案是肯定的,如下:

//方法1:通过默认value属性指明基础包名称
@Configuration
@ComponentScan("Lexus")
public class Car {}

//方法2:通过basePackages更加清晰的指明基础包名称
@Configuration
@ComponentScan(basePackages = "Lexus")
public class Car {}

      现在,我需要指定多个基础包怎么办?当然也是可以得啦,来来来,满足你,看:

@Configuration
@ComponentScan(basePackages = {"Lexus", "Audi", "Benz"})
public class Car {}

  这样,我们就指定扫描雷克萨斯、奥迪和奔驰的所有车了,但是这是String类型的指定,如果哪天雷克萨斯改名了怎么办(有过更改历史哦,自行度娘)?难道再回来这里修改Stirng?太麻烦了????。。。。。不过没关系,因为还有一种方法,就是指定为包中所包含的类或者接口也行,如下:

@Configuration
@ComponentScan(basePackageClasses = {Lexus.class, Audi.class, Benz.class})
public class Car {}

  这里需要注意的是,有一天我的Audi所在的包可能会改变呢?那么这个扫描的就不再是我原来想要设置的基础包了,怎么办?当然也有办法????,不然我也不会提。。。。亲,这边建议你创建空标记接口(marker interface),????。。。也就是指定basePackageClasses时使用空标记接口,这样空标记接口所在包里的类更改位置了,没关系,不应影响原来的设计。

    2)@Component

      该注解表示该类将作为组件类,并告知Spring要为这个类创建bean。使用方法如下

@Component
public class Car {}

  上面这个例子,Spring将会根据类名为创建的bean指定一个ID,具体就是这个bean的ID为car,其实就是将类名的首字母变为小写。咋办?我不想要这个ID呢?可以的,也很简单,如下:

@Component("myCar")
public class Car {}

这样,就会创建一个ID为myCar的bean了。。。。。

    3)@Autowired

  该注解呢,就是自动装配啦,其实就是让Spring自动满足bean依赖的一种方法,使用方法如下:

@Component("myCar")
public class Car {
      private Brand brand;
      private Wheels wheels;

      //方法1:构造器自动装配
      @Autowired
      public Car(Brand brand) {
            this.brand = brand;
      }           

      //方法2:setter方法自动的装配
      @Autowired
      public void setWheels(Wheels wheels) {
            this.wheels = wheels;
      }
}

  自动装配的话,本质是在满足依赖的过程中,会在Spring应用上下文中寻找匹配某个bean需求的其他bean。那OK,如果找到了一个刚好匹配,那当然好,你好我好大家好。。。。但是如果没有找到呢?如果找到了n个可以匹配的呢?

  首先是,没找到咋办?没找到当然就会报异常,但是往往程序中我们不想它报异常,咋办?来来来,看:

@Component("myCar")
public class Car {
      private Brand brand;

      @Autowired(required = false)
      public Car(Brand brand) {
            this.brand = brand;
      }           
}

  像上面这样,将required属性设为false时,Spring会尝试执行自动装配,没找到?那么就自动补充为null,不会再报异常,但是,一定注意的是,相应的bean在使用时,最好进行null值检查,否则不是得报NullPointerException吗?那就是拆了东墙补西墙,不行的。。。。

还有一个是找到了n个可以匹配的咋办?下次再说吧,这里的下次当然不是一般的下次啦,是书中的下次????。。。。。

今天先告一段落,另外两种装配机制,下次再说,这是真的下次????。。。。。

02-三种Bean装配机制(一)

标签:his   pointer   inter   rand   自动装配   point   oid   packages   int   

原文地址:https://www.cnblogs.com/fionyang/p/11123900.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!