一,什么是依赖注入?(DI)
那么我们先来了解一下什么是IOC,所谓的ioc就是控制反转,即把创建对象的交给spring容器管理。那么什么是ioc呢?就是在创建对象时,本对象又引入了其他类的对象或者对本对象的属性进行赋值等操作。那么,springioc和DI是什么关系呢?DI依赖Springioc,也就是说springioc是DI 的前提。
二 ,在java中如何实现对属性的赋值呢?
了解到sping 的依赖注入实际上就是对类的属性的操作,那么我们来看一下java中对属性操作方式有哪些?
(1)通过类的构造方法
(2)通过set方法
(3)通过接口实现对属性的操作
那么下面我们一一看看他们是怎样实现的。
(1)通过类的构造方法
A。创建一个实体类,内部有一个属性为name
package com.test.java;
public class Demo1 {
private String name;
public Demo1(String name) {
this.name = name;
}
public void sys() {
System.out.println("Demo1......"+name);
}
}
B.编写测试代码块
package com.test.java;
import org.junit.Test;
public class TestDemo1 {
/**
* 通过构造方法对属性赋值
*/
@Test
public void testDemo1() {
//创建Demo1对象 ,对demo1的属性name赋值为tom
Demo1 demo1 = new Demo1("tom");
demo1.sys();
}
}
(2)通过set方法
A,编写实体类
package com.test.java;
public class Demo2 {
private String name;
public void setName(String name) {
this.name = name;
}
public void sys() {
System.out.println("demo2......."+name);
}
}
B.编写一个测试类
/**
* 通过set对属性赋值
*/
@Test
public void testDemo2() {
//创建Demo对象
Demo2 demo2 = new Demo2();
//通过set方式对属性name赋值
demo2.setName("lacy");
demo2.sys();
}
(3)通过接口实现对属性的操作
A,辨析接口信息
package com.test.java;
public interface IDemo3 {
public void add(String name);
}
B.编写实体类信息,让其实现接口
package com.test.java;
public class Demo3 implements IDemo3{
private String name;
@Override
public void add(String name) {
// TODO Auto-generated method stub
this.name = name;
}
public void sys() {
System.out.println("demo3....."+name);
}
}
C.辨析测试信息
/**
* 通过接口对属性赋值
*/
@Test
public void testDemo3() {
IDemo3 demo3 = new Demo3();
demo3.add("yang");
((Demo3)demo3).sys();
}
、
三。springioc注入的方式
JAVA的方式有三种方式给属性赋值,而spring只有前两种
即:(1)构造方法
(2)set注入
(1)方式一,构造方法
A。创建实体类
package com.test.ioc;
public class Bean1 {
private String name;
public Bean1(String name) {
// TODO Auto-generated constructor stub
this.name = name;
}
public void sys() {
System.out.println("bean1----------"+name);
}
}
B。在bean.xml中配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- spring通过构造方法 注入 -->
<bean id="bean1" class="com.test.ioc.Bean1">
<constructor-arg name="name" value="tom"></constructor-arg>
</bean>
</beans>
C.测试类编写
@Test
public void testBean1() {
@SuppressWarnings("resource")
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
Bean1 bean1 = (Bean1) applicationContext.getBean("bean1");
bean1.sys();
}
方式二;通过set注入
A。编写实体类
package com.test.ioc;
public class Bean2 {
private String name;
public void setName(String name) {
this.name = name;
@Test
public void testBean2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
bean2.sys();
}
B.配置xml文件
<!-- spring通过set注入 -->
<bean id = "bean2" class = "com.test.ioc.Bean2">
<property name="name" value="lacy"></property>
</bean>
C.编写测试代码
@Test
public void testBean2() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
Bean2 bean2 = (Bean2) applicationContext.getBean("bean2");
bean2.sys();
}
四,springioc通过set的方式注入实体类的对象
在实际开发过程中,我们往往是通过set注入的方式来减少两个类之间的耦合度,使改变时不会对其他的类产生太大影响。
例如:javaweb的三大层框架的service层和dao层。service层需要使用dao层的对象来持久化数据。那么我们现在来模拟一下听过set方式注入。
A。userdao层通过输出模拟请求
package com.test.ioc;
public class UserDao {
public void sys() {
System.out.println("UserDao.......");
}
}
B。userservice调用userdao
package com.test.ioc;
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void sys() {
userDao.sys();
}
}
C。编写配置文件
<!-- 通过set注入对象 -->
<bean id="userDao" class="com.test.ioc.UserDao"></bean>
<bean id = "userService" class="com.test.ioc.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
D。编写测试类
@Test
public void testUserService() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.sys();
}
五。使用set注入注入其他的类型的属性
1.数组
2.集合
3.map
4.properties
A。编写实体类
package com.test.ioc;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class Property {
private String arrs[];
private List<String> list;
private Map<String, String> map;
private Properties properties;
public void setArrs(String[] arrs) {
this.arrs = arrs;
}
public void setList(List<String> list) {
this.list = list;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
public void sys() {
System.out.println(arrs);
System.out.println(list.toString());
System.out.println(map);
System.out.println(properties);
}
}
B。配置xml文件
<!-- 通过set注入注入到特殊属性 -->
<bean id = "property" class = "com.test.ioc.Property">
<property name="arrs">
<list>
<value>tom1</value>
<value>tom2</value>
</list>
</property>
<property name="list">
<list>
<value>name1</value>
<value>name2</value>
</list>
</property>
<property name="properties">
<props>
<prop key="username">root</prop>
<prop key="password">000000</prop>
</props>
</property>
<property name="map">
<map>
<entry key="name1" value="lacy1"></entry>
<entry key="name2" value="lacy2"></entry>
</map>
</property>
</bean>
C。编写测试类
@Test
public void testProperties() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");
Property property = (Property) applicationContext.getBean("property");
property.sys();
}