1.spring装配Bean提供三种主要的机制:
(1)在XML中进行显示配置
(2)在Java中进行显示配置
(3)隐式的bean发现机制和自动装配
2.自动化装配Bean
实现自动化装配两个角度:组件扫描和自动装配
组件扫描:spring会自动发现应用上下文创建的bean
自动装配:spring自动满足bean之间的依赖
2.1 java类的自动装配
类名称上带有@Component 的会作为组件类,并且告知spring创建这个bean,但是组件扫描默认情况下时不启动的,需要显式配置Spring,让他去找带有@Component注解的类,并为其创建bean。
创建一个类,在类名称上添加@ComponentScan注解,启动spring中的组件扫描。如果这个注解不添加任何参数的话就表示这个组件自动扫描的是自己所在包及其子包下的带有@Component注解的类,代码如下:
package sound;
@Component
public class Sgt implements ComPatc {
public void play(){}
}
package sound;
@ComponentScan
public class Config(){
}
组件的命名,首先如果@Component中没有参数,则spring会根据类名指定一个ID,也就是类名的第一个字母变成小写。形如以下的双引号中内容的就是bean的标识(也可以使用@Named(“lonely”) ,多数情境下可以互换)。
@Component("lonely")
public class Sgt (){}
上面了解到自动扫描开启,如果只写@ComponentScan 那么就只会扫描自己所在的包及其子包,如果想让它扫描别的包中的类,就需要设置参数,参数在一般情况下有三种:
1.@ComponentScan(“bund”)扫描value值代表的包
2.@ComponentScan(basePackages=”bund”) 可以是一个数组,如:@ComponentScan(basePackages={“”,”“,”“})
3.@ComponentScan(basePackageClassess={CD.class,DVD.class}),指定为包中特定的接口和类,及指定的类所在的包作为扫描的基础包。(可以考虑创建一个空的接口)
2.2 . xml的自动装配
在spring的配置文件中加context:component-scan base-package=”” (引号中写包的名字) ,然后在需要的类上添加@Controller 或者@Service即可,同样可以在这两个注解中加入value值作为bean的ID标识。
2.3 自动装配
使用@Autowired(@Inject)注解可以将自动扫描到的bean进行自动装配,@Autowired注解可以用在类的任何方法上:
@Autowired
ComPatc sgat;
@Autowired
public CDPlayer(Compatc sgat){}//用在构造函数上
PS:如果没有匹配的bean,创建上下文的时候会抛出异常,为了避免异常的出现可以使用@Auto wired的required属性设置为false。但是如果代码没有进行null的话,可能会出现空指针异常。
3.Java代码装配Bean
如果将第三方库中的组件装配到你的应用中,是不可能在它的类上添加@Component和@Autowired注解的,这时需要使用显示装配。
类上带有@Configuration(可以和@ComponentScan一起使用)表示这个类是spring的一个配置类,在这个类中进行bean的配置,显式装配@Bean
@Configuration
public class CDConfig(){
@Bean
public Compact sgt(){//默认情况下bean的ID和带@Bean的方法的名字一样,可以使用@Bean(name="lone")进行标识的书写
return new sgt();
}
}
如果一个Bean依赖另一个bean可以引用创建bean的方法如:
@Bean
public CD cd(){
return new CD(sgt());//sgt()是创建另一个bean的方法
}
值得一提的是:spring的bean创建机制是单例的,即如果有多个bean调用同一个bean和上面的代码一样的调用,spring不会每一个都为他们创建一个新的依赖bean而是将第一次创建的bean进行传入,即单例只创建一个bean。
4.springxml的显式配置
xml的简单装配,使用 < bean id="" class="" />
如果没参数传递,这是最简单的方式。id是标识,class中写全限定名
4.1 使用构造器初始化bean
<constructor-arg>元素,有ref和value属性,ref表示引入别的bean,value传入一个简单类型 ,可以写多个,按照构造器中的参数循序添加
constructor-arg 有list子元素,使用方法如下:
<bean id="" class="">
<constructor-arg >
<list>
<value> 内容</value>
<value></value>
</list>
</constructor-arg>
</bean>
<bean id="" class="">
<constructor-arg >
<list>
<ref bean="" />
<ref bean="" />
<ref bean="" />
</list>
</constructor-arg>
</bean>
4.2使用setter方法初始化bean(设置属性)
<bean id="" class="">
<property name = "" value = "" /> //value传入值
<property name ="" ref="" />//ref表示引用 name表示属性的名
</bean>
property和constructor-arg使用的list子元素的使用方法是一致的
5.混合配置
javaConfig方法中加载其他的配置类
@Import(CD.class)
配置类中加载xml文件
@ImportResource("classpath:*.xml")
xml文件中加载java配置类
<bean class="包名.类名" />
xml文件中,xml文件
<import resource="" />