Spring 新手教程(三) 注入和自己主动装配

时间:2023-03-09 06:50:48
Spring 新手教程(三) 注入和自己主动装配

     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);
} }

你看会了嘛?欢迎讨论 http://blog.****.net/code_7