一、标签作用
context:component-scan标签可根据写入的包名,扫描指定包及其子包中的所有“类”,并为添加了 @Component(组件),@Service(服务),@Controller(控制器),@Repository(数据仓库)修饰的类创建对象并存入IoC容器。
<context:component-scan base-package=""></context:component-scan>
示例:如下实现类若添加@Service注释,则该类会被创建对象并被存入IoC容器
UserInfoDao.java
@Service
public class UserInfoDao implements IUserInfoDao {
}
特别注意:使用该标签创建对象必须使用“默认构造方法”,否则会返回异常
此外,如果@Controller、 @Component、@Service、@Repository修饰的成员变量有@Autowired修饰,则创建该类对象时会自动从IoC容器中获取该成员变量的值并赋值给响应的变量。
示例:
UserInfoDao.java
@Service
public class UserInfoDao implements IUserInfoDao {
@Autowired(required = false)//false表示如果对应属性无值,则返回null。若为true,则必须有值否则报错
private Date date;
public Date t() {
return date;
}
}
Test.java
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
UserInfoDao userInfoDao = applicationContext.getBean(UserInfoDao.class);
System.out.println(userInfoDao.t());
applicationContext.close();
}
}
Test.java执行后输出当前时间。
注意:在上面示例中,@Autowired注释后面加有额外属性(required = false)表示是否必须要获取到属性值,false表示如果对应属性无值,则返回null。若为true,则必须有值否则报错。
附、相关知识
在使用IoC获取对象时,如果这个类实现了一个接口,那么就可以通过这个接口去创建这个接口的实现类的对象。
示例:
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
IUserInfoDao userInfoDao = applicationContext.getBean(IUserInfoDao.class);
System.out.println(userInfoDao.t());
applicationContext.close();
}
}