1、创建应用程序对象之间的协作关系称为“装配”,这也是DI的本质。
2、Spring容器负责创建引用程序中的bean并通过DI来协调这些对象之间的关系。
3、程序开发人员通过描述bean决定这个bean如何被装配。Spring提供了三种装配方式:
1:在XMl中进行显示的配置
2:在java中进行显示的配置
3:隐式的bean发现机制和自动装配(建议使用方式)
4、自动化装配bean:
Spring从两个角度实现自动化装配:
1:组件扫描:Spring会自动发现应用上下文中所创建的bean
2:自动装配:Spring自动满足bean之间的依赖
5、组件扫描:
1:使用Component告诉Spring该类会作为组件,并创建这个类的bean。
@Component
public class 光盘 implication 光盘接口{
...
}
2:开启组件扫描功能:
1:使用java显示的配置方法:
@Configuration
@ComponentScan //@ComponentScan 使Spring开启了组件扫描
public class 光盘播放配置{}
2:使用Xml显示配置方法:
<context:component-scan base-package="需要扫描的包名"/>
6、为bean命名:
1:Spring会自动给上下文中的所有bean给一个ID。(类名首字母小写)
2:使用@Component注解自定义ID
@Component("光盘ID")
public class 某种光盘 extends 光盘接口{...}
3:使用@Named注解自定义ID
@Named("光盘ID")
public class 某种光盘 extends 光盘接口{...}
(后两者有细微区别,但是大多数情况下可以互换)
7、设置组件扫描的基础包:
@ComponentScan("包名")
@ComponentScan(basePackages={"包名","包名"})
@ComponentScan(basePackageClasses={包中的类或者接口1.Class , 包中的类或者接口2.Class})
例如:
@Configuration
@ComponentScan("需要扫描的包名")
public class 光盘配置类{...}
更加详细的设置:
@Configuration
@ComponentScan(basePackages = "需要扫描的包名")
//@ComponentScan(basePackages={"包1","包2"}) //同时设置多个报名(参数类型是String,有可能会不安全)
//@ComponentScan(basePackageClasses={包中的类或者接口1.Class , 包中的类或者接口2.Class}) //使用basePackageClasses指定的类所在的包将自动扫描
public class 光盘配置类{...}
8、通过注解实现bean的自动装配
(自动装配就是让Spring自动满足bean依赖的一种方式)使用的注解是:@Autowired
例如:
@Component
public class 光盘播放 implements 接口{
@Autowired //Spring在创建这个类的bean时会通过这个构造器实例化,并且传入需要的参数类型的bean。
public 构造方法(参数列表){...}
@Autowired //Spring会尽力满足这个函数需要匹配的bean,如果只有一个匹配成功则使用,但是如果没有匹配到的话Spring抛出一个异常,如果匹配到多个也抛异常。
public 普通方法(参数列表){...}
@Autowired(required = false) //如果没有检测到合适的bean,将设置为未装配,不抛异常)(如果代码中没有非null判断的话有可能会抛nullPointException)
public 普通方法(参数列表){...}
}
//@Autowired注解是Spring特有的注解,也可以使用java的依赖注入规范中的@Inject注解(有细微差别,可以通用。)@Named也是java依赖注入规范的注解。
9、自动装配不可行的情况:
如果你在程序中要使用第三方的库,你是无法在它的类上写@component和@Autowired注解的。
10、使用javaConfig的方式配置装配bean
例如:
@Configuration
//@Configuration表明这个类是一个配置类,该类包含了Spring中创建bean的细节。
public class 配置类类名{...}
11、在javaConfig中声明简单的bean(因为没有依赖所以简单)
需要在配置方法中创建一个方法:这个方法需要返回所需类型的实例,并使用@Bean标记
例如:
@Bean //@Bean注解会告诉Spring,该方法返回的对象需要注册到上下文bean中(beanID和方法名一样。@Bean(name = "自定义ID"))
public 光盘 光盘配置(){
return new 光盘;
}
12、借助JavaConfig实现注入
1:第一中方法:
@Bean
public 光盘播放 光盘播放配置(){
return new 光盘播放(光盘配置());
}
2:第二中方法(推荐使用)
@Bean
public 光盘播放 光盘播放配置函数(光盘类 光盘){
return new 光盘播放(光盘);
}
13、通过Xml装配Bean
1:首先需要创建一个Xml配置文件,以<beans>作为根元素。
2:使用<bean>声明一个bean:
例如:
<bean class = "" /> //自动生成ID
<bean id="ID" class = ""> //自定义ID(推荐使用)
14、使用Xml实现注入:
1:构造器注入bean引用:
例如:
<bean id = "光盘" class = "类路径" />
<bean id = "光盘播放" class = "类路径"> //Spring遇到<bean>:创建对应的bean
<constructor-arg ref = "光盘"> //告诉Spring需要一个ID是“光盘”的bean被引入到构造方法中。
</bean>
也可以使用Spring3.0的C命名空间的形式。
2:将字面值注入到构造器中:
之前的例子都是:构造函数中接收的都是引用,有时候需要接收特定的值:
例如:
//构造函数接收两个字符串
<bean id = "光盘" class= "路径">
<constructor-arg value = "一个字符串" />
<constructor-arg value = "一个字符串" />
</bean>
3:装配集合:
1:装配一个拥有磁道的光盘(磁道是空的):
<bean id = "光盘" class = "">
<constructor-arg value = "字符串">
<constructor-arg value = "字符串">
<constructor-arg><null></constructor-arg> //告诉Spring构造这个光盘的时候需要一个空磁道
</bean>
2:装配一个包含磁道列表的光盘(list<String>)
<bean id = "光盘" class = "">
<constructor-arg value = "字符串">
<constructor-arg value = "字符串">
<constructor-arg>
<list>
<value>"磁道1的描述"</value>
<value>"磁道2的描述"</value>
<value>"磁道3的描述"</value>
<value>"磁道4的描述"</value>
</list>
</constructor-arg>
</bean>
3:上面的list中的<value>也可以是<ref bean = "" />
例如:
//依赖存放于list的bean
<bean id = "光盘" class = "">
<constructor-arg value = "字符串">
<constructor-arg value = "字符串">
<constructor-arg>
<list>
<ref bean = "" />
<ref bean = "" />
<ref bean = "" />
</list>
</constructor-arg>
</bean>
4:注意:
上面的list也可以使set等。如果是set,在装配的时候将会去重且不能保证装配顺序。
15、设置属性:
到目前为止:bean的属性都是通过构造方法传进来的。下面介绍直接在xml中设置属性:
例如:
//假设,“光盘播放器”有一个属性是光盘,但是构造方法不提供接收参数。
<bean id = "光盘播放器ID" class = "">
<property name = "属性名称" ref = "光盘bean的ID"> //告诉Spring这个属性对应的bean。
</bean>
16、将字面值注入到属性中 && 将list注入到属性中:
<bean id ="" class>
<property name = "属性名称" value = "一个字符串"> //将字面值注入到属性
<property name = "list属性名称" > //将list注入到属性集合
<list>
<value> "字面值" </value>
<value> "字面值" </value>
</list>
</property>
</bean>
17、java配置,xml配置,自动配置。可以混合使用。(具体可以看书)