DI:依赖注入,前提必须有IOC的环境,Spring管理这个类的时候将类的依赖的属性注入(设置)进来。
1、用注解向Spring容器注册bean必须配置<context:component-scan base-package="com.heima"></context:component-scan>
2、用注解实现bean的依赖注入,需要配置包扫描<context:component-scan base-package="com.heima"></context:component-scan>。如果没有配置报扫描,也可以单独配置 <context:annotation-config></context:annotation-config>
两个接口:
IUserService
public interface IUserService {
public void invokeSave();
}
IUserDao
public interface IUserDao {
public void save();
}
接口实现类:
/*
*相当于在application.xml文件配置了
*<bean id="userDao" class="com.heima.demo1.UserDaoImpl">
*/
@Repository("userDao")
public class UserDaoImpl implements IUserDao {
@Override
public void save() {
System.out.println("执行用户保存方法");
}
public UserDaoImpl(){
System.out.println("UserDaoImpl 执行构造方法");
}
}
@Service("userService")
public class UserServiceImpl implements IUserService {
public UserServiceImpl(){
System.out.println("UserServiceImpl 构造方法");
}
/*
* 依赖注入
*/
@Autowired
@Qualifier("userDao")
//@Resource(name="userDao")
private IUserDao userDao;
@Override
public void invokeSave() {
System.out.println("UserServiceImpl执行 invokeSave");
userDao.save();
}
}
测试类:
public class Demo1 {
@Test
public void test1(){
ApplicationContext application = new ClassPathXmlApplicationContext("applicationContext.xml");
IUserService service = (IUserService) application.getBean("userService");
/*
* 如果用该种方式,该service不是由Spring管理的
* 在UserServiceImpl用了Spring的依赖注入就无法生效
* 会导致 UserServiceImpl 中的 IUserDao为null
*/
//IUserService service = new UserServiceImpl();
service.invokeSave();
}
}