Spring注入
Spring注入
重点还是看实例吧
实例:
有一个InjectionDao的接口,然后InjectionDaoImpl实现了InjectionDao接口,相当于完成了数据库的操作。
有一个InjectonServer的接口,然后InjectonServerImpl实现了InjectonServer接口,这是服务层的操作。
下面是设值注入和构造注入:
我们需要在service层完成逻辑操作,所以service层肯定需要调用dao层来完成数据库的操作。
所以service层肯定有dao层的对象,而我们说的设值注入,构造注入,就是对这个对象而言的。
在类中给对象赋值的方式有两种,一种是set方式,一种是构造函数,就对应我们这里所说的设值注入和构造注入。
所以在service层的时候我们有dao对象的set方法和构造函数。
但是,这个set方法的调用(设值注入)和构造函数的调用(构造注入)却是通过配置文件来完成的。
这个配置文件相当于IOC容器的功能,所以运行实例的时候,要先引入容器,也就是先引入XML文件。
其实,设值注入和构造注入就是XML文件(IOC容器)完成了成员赋值(调用set函数或者构造器)的过程。
IOC方式我们用的对象不是我们自己创建的,也是IOC容器给我们的,我们通过getBean的方式申请对象,如下:
代码:
spring-injection.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 7 <!-- <bean id="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl"> --> 8 <!-- <property name="injectionDAO" ref="injectionDAO"></property> --> 9 <!-- </bean> --> 10 11 <bean id="injectionService" class="com.imooc.ioc.injection.service.InjectionServiceImpl"> 12 <constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg> 13 </bean> 14 15 <bean id="injectionDAO" class="com.imooc.ioc.injection.dao.InjectionDAOImpl"></bean> 16 17 </beans>
InjectionDAO.java
1 package com.imooc.ioc.injection.dao; 2 3 public interface InjectionDAO { 4 5 public void save(String arg); 6 7 }
InjectionDAOImpl.java
1 package com.imooc.ioc.injection.dao; 2 3 public class InjectionDAOImpl implements InjectionDAO { 4 5 public void save(String arg) { 6 //模拟数据库保存操作 7 System.out.println("保存数据:" + arg); 8 } 9 10 }
InjectionService.java
1 package com.imooc.ioc.injection.service; 2 3 public interface InjectionService { 4 5 public void save(String arg); 6 7 }
InjectionServiceImpl.java
1 package com.imooc.ioc.injection.service; 2 3 import com.imooc.ioc.injection.dao.InjectionDAO; 4 5 6 public class InjectionServiceImpl implements InjectionService { 7 8 private InjectionDAO injectionDAO; 9 10 //构造器注入 11 public InjectionServiceImpl(InjectionDAO injectionDAO1) { 12 this.injectionDAO = injectionDAO1; 13 } 14 15 //设值注入 16 public void setInjectionDAO(InjectionDAO injectionDAO) { 17 this.injectionDAO = injectionDAO; 18 } 19 20 public void save(String arg) { 21 //模拟业务操作 22 System.out.println("Service接收参数:" + arg); 23 arg = arg + ":" + this.hashCode(); 24 injectionDAO.save(arg); 25 } 26 27 }
TestInjection.java
1 package com.imooc.test.ioc.interfaces; 2 3 import org.junit.Test; 4 import org.junit.runner.RunWith; 5 import org.junit.runners.BlockJUnit4ClassRunner; 6 7 import com.imooc.ioc.injection.service.InjectionService; 8 import com.imooc.test.base.UnitTestBase; 9 10 @RunWith(BlockJUnit4ClassRunner.class) 11 public class TestInjection extends UnitTestBase { 12 13 public TestInjection() { 14 super("classpath:spring-injection.xml"); 15 } 16 17 @Test 18 public void testSetter() { 19 InjectionService service = super.getBean("injectionService"); 20 service.save("这是要保存的数据"); 21 } 22 23 @Test 24 public void testCons() { 25 InjectionService service = super.getBean("injectionService"); 26 service.save("这是要保存的数据"); 27 } 28 29 }