链接:https://pan.baidu.com/s/1QvDJ-eVTk0uTuzDlojtn7A?pwd=ecfv
提取码:ecfv先导入项目,成功运行,再学习!
1.创建一个动态web项目,并且把四个基础包和一个拓展包复制到lib目录下。
2.在src目录下创建ioc_di包,创建接口UserDao,在接口中定义一个login()方法。
package ioc_di;
public interface UserDao {
public void login();
}
3.在ioc_di包下创建类UserDaoImpl实现UserDao中的login()方法,并输出语句。
package ioc_di;
public class UserDaoImpl implements UserDao{
@Override
public void login() {
// TODO Auto-generated method stub
System.out.println("登陆成功!!!");
}
}
4.在src目录下创建Spring的配置文件applicationContext.xml。并在配置文件中创建一个id为userDao的Bean。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="ioc_di.UserDaoImpl"></bean>
</beans>
5.在ioc_di包下创建测试类IoC,并在类中编写main()方法及实现IoC的代码
package ioc_di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class IoC {
public static void main(String[] args) {
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过容器获取userDao实例
UserDao userDao= (UserDao) applicationContext.getBean("userDao");
//3.调用示例中的login()方法
userDao.login();
}
}
该程序执行后可以看到
从中可以看出,控制台成功输出了 UserDaolmpl类中的输出语句。在main()方法中,并没有通过 new 关键字来创建 UserDao 接口的买现类对象,而是通过 Spring 容器来获取的实现对象,这就是 Spring IoC(控制反转)的工作机制。
6.在ioc_di包中创建接口UserService,并编写DoTest()方法
package ioc_di;
public interface UserService {
public void DoTest() ;
}
7.在ioc_di包下创建类UserSerServiceImpl实现UserService接口,在类中声明userDao属性,并添加属性的setter()方法,同时编写DoTest()方法。
package ioc_di;
public class UserServiceImpl implements UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao=userDao;
}
@Override
public void DoTest() {
// TODO Auto-generated method stub
this.userDao.login();
System.out.println("测试成功!!!");
}
}
8.在配置文件中创建id为userService的Bean,该Bean用于实例化UserServiceImpl类的信息,并将name为userDao的实例注入userService中。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDao" class="ioc_di.UserDaoImpl"></bean>
<bean id="userService" class="ioc_di.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
</beans>
在上述代码中,<property>是<bean>元素的子元素,用于调用 Bean 实例中的 setUserDao()方法完成属性赋值,从而实现依赖注入。其name 属性表示 Bean 实例中的相应属性名,ref 属性用于定其属性值。
9.在ioc_di包中创建测试类DI
package ioc_di;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class DI {
public static void main(String[] args) {
//1.初始化Spring容器,加载配置文件
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
//2.通过容器获取userService实例
UserService userService=(UserService) applicationContext.getBean("userService");
//3.通过实例调用DoTest()方法
userService.DoTest();
}
}
从中可以看出,使用 Spring 容器通过 UserService 实现类中的 DoTest()方法调了 UserDao 实现类中的 login()方法,实现类中的 DoTest()方法,并输出了结果。这就是 Spring 容器属性 setter 注入的方式,也是实际开发中常用的一种方式。