Spring注入是指在启动Spring容器加载bean配置的时候,对类变量的赋值。
两种常用注入方式:设值注入和构造注入
下面就这部分知识看代码以及代码中的注解:
1、首先看Spring 配置文件(如何加载,怎么测试,《入门系列(一)》有说明,这里不再赘述)
<?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" >
<!-- 下面是设值注入 ,注意 <property name="injectionDAO" ref="injectionDAO"></property>这行代码,
不管是这里的设值还是下面的构造一定要在需要引用对象的类中加上相应的方法供Spring容器使用,实际开发中两种只需要选择一种即可 ->
<!-- <bean id="injectionService" class="com.xidian.ioc.injection.service.InjectionServiceImpl"> -->
<!-- <property name="injectionDAO" ref="injectionDAO"></property> -->
<!-- </bean> -->
<!--这里是构造注入 -->
<bean id="injectionService" class="com.xidian.ioc.injection.service.InjectionServiceImpl">
<constructor-arg name="injectionDAO" ref="injectionDAO"></constructor-arg>
</bean>
<bean id="injectionDAO" class="com.xidian.ioc.injection.dao.InjectionDAOImpl"></bean>
</beans>
2、看待注入的类:
package com.xidian.ioc.injection.dao;
public interface InjectionDAO {
public void save(String arg);
}
package com.xidian.ioc.injection.dao;
import com.xidian.ioc.injection.dao.InjectionDAO;
public class InjectionDAOImpl implements InjectionDAO {
public void save(String arg) {
//模拟数据库保存操作
System.out.println("保存数据:" + arg);
}
}
3、Service类
package com.xidian.ioc.injection.service;
public interface InjectionService {
public void save(String arg);
}
import com.xidian.ioc.injection.dao.InjectionDAO;
public class InjectionServiceImpl implements InjectionService {
private InjectionDAO injectionDAO;
//【重要】构造器注入 ,这个方法一定要有,如果在前面的spring上下文中是用构造注入的方法
public InjectionServiceImpl(InjectionDAO injectionDAO1) {
this.injectionDAO = injectionDAO1;
}
//【重要】设值注入,这个方法一定要有,而且名字一定要是setXxx,不然spring容器加载不出来
public void setInjectionDAO(InjectionDAO injectionDAO) {
this.injectionDAO = injectionDAO;
}
public void save(String arg) {
//模拟业务操作
System.out.println("Service接收参数:" + arg);
arg = arg + ":" + this.hashCode();
//Spring对象会自动调取生成相应的对象
injectionDAO.save(arg);
}
}
自动装配(Autowiring):
byname:根据属性名自动装配;
byType:如果容器中存在一个与该属性名相同的bean,那么久自动装配;但是,如果存在多个,则会抛出异常;如果没找到则不报异常,但什么也不做;
Constructor:与byType方式类似,不同之处在于它应用于构造器参数,如果容器中没有找到与构造器类型一致的bean,那么则抛出异常。
自动注入,把装配的相关操作放到了具体类中,要在相应的方法中传入(该方法不能少),具体细节看代码注释:
1、Spring的配置文件:
<?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"
default-autowire="constructor">
<!--自动注入配置,还可以有byName,byType。byName实际上是看bean的id;
而用byType则是看类型的,如果有多个相同的type则报异常;实际上用自动注入时,省掉的是在下面的bean注入配置;
自动注入,把装配的相关操作放到了具体类中,要在相应的方法中传入。-->
<bean id="autoWiringService" class="com.xidian.autowiring.AutoWiringService" ></bean>
<!-- 如果不是用自动注入的方法,这这边必须人为的进行设置,比如这边的方法:
<bean id="autoWiringService" class="com.xidian.autowiring.AutoWiringService" >
<property name="autoWiringDAO" ref="autoWiring"></property>
</bean>
-->
<!-- 待注入的对象 -->
<bean class="com.xidian.autowiring.AutoWiringDAO" ></bean>
</beans>
2、待自动注入类:
package com.xidian.autowiring;
//该类被配置到了相应的配置文件spring-autowiring.xml中,也就是待注入的对象类
public class AutoWiringDAO {
public void say(String word) {
System.out.println("AutoWiringDAO : " + word);
}
}
3、注入类:
package com.xidian.autowiring;
//该类被配置到了相应的配置文件当中spring-autowiring.xml
public class AutoWiringService {
private AutoWiringDAO autoWiringDAO;
//如果使用构造方法自动注入的方法,则这边必须写上这个方法。前面虽然免去的在Spring配置文件bean的设置,但是这边省不了!
public AutoWiringService(AutoWiringDAO autoWiringDAO) {
System.out.println("AutoWiringService");
this.autoWiringDAO = autoWiringDAO;
}
//同上。必须有的方法 , 传入AutoWiringDAO对象。前面虽然免去的在spring配置文件bean的设置,但是这边省不了!
public void setAutoWiringDAO(AutoWiringDAO autoWiringDAO) {
System.out.println("setAutoWiringDAO");
this.autoWiringDAO = autoWiringDAO;
}
public void say(String word) {
this.autoWiringDAO.say(word);
}
}