标签:his pointer inter rand 自动装配 point oid packages int
Spring要创建哪些bean并且如何将其装配在一起,现有的,主要是三种装配机制:
这三种装配机制可以互相搭配使用,即是可以共存的。接下来就分别介绍啦????。。。。。
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个可以匹配的咋办?下次再说吧,这里的下次当然不是一般的下次啦,是书中的下次????。。。。。
今天先告一段落,另外两种装配机制,下次再说,这是真的下次????。。。。。
标签:his pointer inter rand 自动装配 point oid packages int
原文地址:https://www.cnblogs.com/fionyang/p/11123900.html