spring入门程序:
1、导入Spring的4个基础包以及commons-logging的JAR包复制到lib目录中
2、src->com.itheima.ioc包下:
①UserDao.java
1 package com.itheima.ioc; 2 3 public interface UserDao { // 创建接口UserDao 4 public void say(); // 只声明say()方法,不能定义 5 }
②UserDaoImpl.java
1 package com.itheima.ioc; 2 3 public class UserDaoImpl implements UserDao{ // 创建接口UserDao的实现类UserDaoImpl 4 public void say() { // 需要定义接口中的say()方法 5 System.out.println("userDao say hello World !"); 6 } 7 }
③控制反转测试类:TestIoC.java
1 package com.itheima.ioc; 2 3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5 6 public class TestIoC { 7 public static void main(String[] args) { 8 // 1、初始化Spring容器,加载配置文件 9 String xmlPath = "beans.xml"; 10 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); 11 12 // 2、通过容器获取userDao的Bean实例userDaoID 13 UserDao userDao = (UserDao) applicationContext.getBean("userDaoID"); 14 15 // 3、调用实例中的say()方法 16 userDao.say(); 17 18 //不需要自己new,都是从Spring容器直接获得 19 // 之前的实现:new 接口的实例 20 //UserDao userDao = new UserDaoImpl(); 21 //userDao.say(); 22 } 23 }
④UserService.java
1 package com.itheima.ioc; 2 3 public interface UserService { // 创建接口UserService 4 public void save(); // 只声明save()方法,不能定义 5 }
⑤UserServiceImpl.java
1 package com.itheima.ioc; 2 3 public class UserServiceImpl implements UserService{ // 创建接口UserService的实现类UserServiceImpl 4 // 之前的做法:方式1:接口 接口对象= new 实现类(),即 5 //private UserDao userDao = new UserDaoImpl(); 6 //有了Spring之后(解耦:UserServiceImpl实现类使用了成员变量UserDao接口,不用知道接口具体的实现类), 7 // 方式2:接口+setter方法 8 // 1)、声明属性UserDao,(依赖的接口对象) 9 private UserDao userDao; 10 11 // 2)、添加UserDao属性的setter方法,Spring才能将创建的接口对象userDao赋值给调用者的成员变量userDao(接口实例对象)!!! 12 public void setUserDao(UserDao userDao) { 13 this.userDao = userDao; 14 } 15 16 // 3、实现接口中的方法,需要重新定义 17 public void save() { 18 // 调用成员变量userDao中的say()方法,并执行输出语句 19 this.userDao.say(); 20 System.out.println("userService add a user!"); 21 } 22 }
⑥依赖注入测试类:TestDI.java
1 package com.itheima.ioc; 2 3 import java.nio.channels.AcceptPendingException; 4 import org.springframework.context.ApplicationContext; 5 import org.springframework.context.support.ClassPathXmlApplicationContext; 6 7 public class TestDI { 8 public static void main(String[] args) { 9 // 1、初始化spring容器,加载配置文件 10 String xmlPath = "beans.xml"; 11 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); 12 // 2、通过容器获取UserService的Bean实例userServiceID 13 //UserService userService = (UserService) applicationContext.getBean("userServiceID"); 14 // 有了XML配置文件,那么Spring就可以通过配置文件中的bean-id来创建我们需要的对象,下面这样写就不用将其强转了 15 UserService userService = applicationContext.getBean("userServiceID", UserService.class); 16 // 3、调用实例中的save()方法 17 userService.save(); 18 } 19 }
⑦配置文件:beans.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd"> 6 <!-- 上面是Spring的约束配置,无需手写,直接查文档 --> 7 <!-- 将指定类配置给Spring,让Spring创建其对象的实例 --> 8 <bean id="userDaoID" class="com.itheima.ioc.UserDaoImpl" ></bean> 9 <!-- 创建一个id为userDaoID的Bean实例,其中class属性用于指定需要实例化Bean的类 --> 10 11 <!-- 添加一个id为userServiceID的Bean的实例 --> 12 <bean id="userServiceID" class="com.itheima.ioc.UserServiceImpl"> 13 <!-- 将id为userDaoID的Bean实例注入到userService实例中, 14 即被依赖对象userDao也由Spring来管理,通过这种方法就降低了耦合度,完全由Spring的Bean来管理 15 --> 16 <property name="userDao" ref="userDaoID"></property> 17 <!-- property: 用于对属性赋值(注入),底层将执行setter方法 18 name:setter方法参数实例名,通过setter方法获得 19 ref:另一个bean的id值(接口实例类)的引用,创建userDao对象的bean的id值userDaoID 20 具体执行过程:先创建UserService对象,然后在根据property中的ref找到userDaoID并创建UserDao对象, 21 然后根据property中的name,通过setter方法对其赋值,这样就完成了依赖注入。 22 --> 23 </bean> 24 </beans>
3、执行结果: