1、简单类型和复合类型的setter注入
DI:Dependency Injection(依赖注入)
从字面上分析:
IoC:指将对象的创建权,反转到Spring容器
DI:指Spring容器创建对象的过程中,将对象依赖属性通过配置进行注入
其实它们是同一个概念的不同角度描述。DI相对IoC而言,明确描述了“被注入对象依赖IoC容器配置依赖对象”。
1)怎么注入值:
方式1:属性注入,通过setter方法;
方式2:构造器注入,通过构造器;
2)注入的方式:
手动装配:
基于XML:
基于注解:
自动装配:不安全,不推荐
3)注入哪些类型的值:
①简单值类型:基本类型+String+URL等
②复合类型(对象类型):
③集合类型(了解,框架内部使用)
2、集合类型的setter注入
Java类:
public class Employee{
private String name;
private Integer age;
private Double salary;
private URL url;
// 省略getter、setter方法
}
public class EmployeeService{
private EmployeeDao employeeDao;
public void setEmployeeDao(EmployeeDao employeeDao){
employeeDao = employeeDao;
}
public void save(){
employeeDao.save();
System.out.println("Service.save()")
}
}
public class EmployeeeDao{
public void save(){
System.out.println("Dao.save()")
}
}
public class CollectionBean { private Set<String> set; private List<String> list; private String[] array; private Map<String,String> map; private Properties prop; // 省略getter、setter }
配置文件:
<!-- ①简单值类型:基本类型+String+URL等 --> <bean id="employee" class="Employee全限定名"> <property name="name" value="John"/> <property name="age" value="20"/> <property name="salary" value="5000"/> <property name="url" value="http://www.baidu.com"/> </bean> <!-- ②复合类型 --> <bean id="employeeDao" class="EmployeeDao全限定名"/> <bean id="employeeService" class="EmployeeService全限定名"> <property name="employeeDao" ref="employeeDao"/> </bean> <!-- ③集合类型(了解,内部框架使用) --> <bean id="collectionBean" class="CollectionBean全限定名"> <!-- Set集合 --> <property name="set"> <set> <!-- 引用类型使用<bean> --> <value>set1</value> <value>set2</value> </set> </property> <!-- List集合 --> <property name="list"> <list> <!-- 引用类型使用<bean> --> <value>list1</value> <value>list2</value> </list> </property> <!-- 数组类型 --> <property name="array"> <array> <!-- 引用类型使用<bean> --> <value>array1</value> <value>array2</value> </array> </property> <!-- Map集合 --> <property name="map"> <map> <entry key="key1" value="value1"/> <entry key="key2" value="value2"/> </map> </property> <!-- Properties集合 --> <property name="prop"> <props> <prop key="pKey1">pValue1</prop> <prop key="pKey2">pValue2</prop> </props> </property> </bean>
有的时候,若想只有一个bean引用另一个bean,类似于匿名内部类
<bean id="employeeService" class="EmployeeDao全限定名">
<property name="employeeDao">
<bean class="EmployeeDao全限定名"/>
</property>
</bean>
3、构造器注入
配置文件
<!-- ①简单值类型:基本类型+String+URL等 --> <bean id="employee" class="Employee全限定名"> <!-- index:表示第几个参数 type:参数的类型 name:参数名称 value:参数的简单类型值 ref:参数的符合类型值 --> <constructor-arg name="name" value="John"/> <constructor-arg name="age" value="20"/> <constructor-arg name="salary" value="5000"/> <constructor-arg name="url" value="http://www.baidu.com"/> </bean> <!-- ②复合类型 --> <bean id="employeeDao" class="EmployeeDao全限定名"/> <bean id="employeeService" class="EmployeeService全限定名"> <constructor-arg name="employeeDao" ref="employeeDao"/> </bean> <!-- ③集合类型(了解,内部框架使用) --> <bean id="collectionBean" class="CollectionBean全限定名"> <!-- Set集合 --> <constructor-arg name="set"> <set> <!-- 引用类型使用<bean> --> <value>set1</value> <value>set2</value> </set> </constructor-arg> <!-- List集合 --> <constructor-arg name="list"> <list> <!-- 引用类型使用<bean> --> <value>list1</value> <value>list2</value> </list> </constructor-arg> <!-- 数组类型 --> <constructor-arg name="array"> <array> <!-- 引用类型使用<bean> --> <value>array1</value> <value>array2</value> </array> </constructor-arg> <!-- Map集合 --> <constructor-arg name="map"> <map> <entry key="key1" value="value1"/> <entry key="key2" value="value2"/> </map> </constructor-arg> <!-- Properties集合 --> <constructor-arg name="prop"> <props> <prop key="pKey1">pValue1</prop> <prop key="pKey2">pValue2</prop> </props> </constructor-arg> </bean>
Java类:
public class Employee{ private String name; private Integer age; private Double salary; private URL url; // 构造器 public void Employee(String name,Integer age,Double salary,URL url){ this.name = name; this.age= age; this.salary= salary; this.url= url; } }
public class EmployeeService{ private EmployeeDao employeeDao;
// 构造器 public void EmployeeService(EmployeeDao employeeDao){ this.employeeDao = employeeDao; } public void save(){ employeeDao.save(); System.out.println("Service.save()") } }
测试类:
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration pulic class DITest { @Autowired private ApplicationContext ctx; // ①简单值类型 @Test public void testValue() thows Exception { System.out.println(ctx.getBean("employee")); } // ② 复合类型 @Test public void testBean() thows Exception { EmployeeService service = ctx.getBean("employeeService",EmployeeService.class); service.save(); } // ③ 集合类型(了解,框架内部使用) @Test public void tesCollection() thows Exception { System.out.println(ctx.getBean("collectionBean")); } }