装配bean的方法:
选择使用XML装配一些bean,使用Spring基于Java的配置(JavaConfig)来装配另一些bean, 而将剩余的bean让Spring去自动发现,概括起来一共是两种技术:显示装配技术、自动化装配技术,其中自动化装配技术最为强大。
spring 实现自动化装配j技术包括:
·组件扫描:Spring会自动发现应用上下文中所创建的bean,
·自动装配:Spring自动满足bean 之间的依赖。
1、组件扫描:首先创建一个Java类,并使用@Component标注,告诉spring这是一个注解类,需要为该类创建一个bean,
@Component
public class SgtPeppers implements CompactDisc {
private String title="Sgt. Peppers Lonely Hearts Club Band";
private String artist="The Beatles";
public void play() {
// TODO Auto-generated method stub
System.out.println("Playing "+title +"by "+artist);
}
}
但是组件扫描默认是不启用的,需要我们显示配置Spring,命令其寻找带有@Component注解的类,为类创建bean
package com.ssm.interImpl;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class CDPlayerConfig {
}
其中注解@ComponentScan 能够在spring中启用组件扫描,该注解默认会启用扫描与配置类相同的包及该包下的子包。
如果使用xml来启用组件扫描的话,那么可以使用spring context命名空间的
<context:component-scan>
测试代码:
package example;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import com.ssm.inter.CompactDisc;
import com.ssm.interImpl.CDPlayerConfig;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CDPlayerConfig.class)
public class CDPlayerTest {
@Autowired
private CompactDisc cd;
@Test
public void cdShouldNotBeNUll() {
System.out.println(cd);
}
}
(1)为bean 命名
通常spring会为创建的bean设置不同的ID,默认是将类名的第一个字母变为小写。我们还可以为bean自定义唯一的ID,
@Component("comSgtPeppers ")
public class SgtPeppers implements CompactDisc {
}
(2)设置扫描的基础包。是因为正常我们的配置类所在包回是一个单独的包,所以这里需要指明要扫描的组件的包,同时还可以设置多个要扫描的包。
@Configuration
@ComponentScan(basePackages="com.ssm.interImpl")
public class CDPlayerConfig {
}
2、通过为bean添加注解实现自动装配。
首先是@Autowired,使用方式一共有两种,一种是用在构造器上,还可以用在属性的Setter方法上(这里可以是任意方法)。如果没有匹配的bean,那么会抛出一个异常,[提示:如果是上述两种方法都没有使用,直接在属性上使用@Autowired注解,抛出空指针异常,如果有多个bean都满足,同样也会抛出异常,自动装配的歧义性接下来会讲。]
@Component
public class CDPlayer implements MedailPlayer{
private CompactDisc cd;
@Autowired
public CDPlayer (CompactDisc cd){
this.id=id;
}
}
@Autowired
public void setCompactDisc(CompactDisc cd){
this.cd=cd;
}
注:仅个人理解,望大神多指点。