在使用Spring的注解方式时,常常会听到一个名词叫“注入”,其实这里完全可以理解为把某个属性值赋值到对应的引用数据类型变量中。“注入”一词主要用于属性的注入,而bean实例的创建往往没有“注入”一说。
在Spring IoC中主要提供了两个注解用于bean的创建和属性的注入,即
@Component
和@Autowired
①这里
@Component
用在类声明上,用于告知Spring,比如当前创建的UserDaoImp类中,在后续的使用中,肯定是会需要UserDaoImp类的实例对象的,所以现在提供需要为当前UserDaoImp类创建一个实例(默认单例模式创建实例对象),实例名默认为当前类名首字母小写的形式,所以@Component
就是在通知Spring你要预先给这个类实例化,所以接口与抽象类不能使用这个注解,因为他们没法实例化对象。
②而@Autowired
则用在属性上,Spring检测到该注解之后就会在IoC容器中查找是否有与该属性相匹配的类或子类实例,有的话就注入到当前属性中,否则就会报错。例如,在UserService类中:@Autowired //根据类型进行注入 private UserDaoImp userdaoImp; //为了区分实例化对象,所以将这里将字母D改为小写
此时在userDaoImp属性上标
@Autowired
,意味着Spring在看到该属性后,会到IOC容器中寻找是否存在UserDaoImp类的实例化对象,上面说到通过@Component
已经创建了一个实例userDaoImp,所以将此实例化对象赋值给userdaoImp,即:UserDaoImp userdaoImp = userDaoImp;
这个赋值的过程就被称为属性的“注入”。
UserDao接口:
public interface UserDao {
public void info();
}
UserDaoImp实现类:
@Component
public class UserDaoImp implements UserDao {
@Override
public void info() {
System.out.println("info()..............");
}
}
UserService类:
//注解中value的默认值为UserService的首字母为小写,也就是userService
@Service(value = "userService") //此处等同于xml配置中的<bean id="userService",class="com.maweirdos.service.UserService"/>
public class UserService {
@Autowired //根据类型进行注入
@Qualifier(value = "userDaoImp") //根据name名称进行注入
private UserDaoImp userDaoImp;
public void Add(){
System.out.println("add()..............");
userDaoImp.info();
}
}
测试类:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
UserService userService = context.getBean("userService", UserService.class);
userService.Add();
}
输出结果:
add()..............
info()..............