go4it

just do it

Spring视频学习(四)Spring手工和自动注解

一、依赖注入的形式:

clip_image002

二、其中的手工装配:

clip_image002[5]

分:XML配置和注解配置。

其中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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	                   http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	                   http://www.springframework.org/schema/context
	                   http://www.springframework.org/schema/context/spring-context-2.5.xsd
	                   ">


<context:component-scan base-package="com.persia">
<!-- 开启组件扫描 -->
</context:component-scan>

<context:annotation-config>
<!--开启注解处理器-->
</context:annotation-config>
<!-- 使用注解,省去了propertity的xml配置,减少xml文件大小 -->
<bean id="personServiceAnno" class="com.persia.PersonServiceAnnotation"></bean>
<bean id="personDaoBeanAnno" class="com.persia.PersonDaoBean"></bean>
<bean id="personDaoBeanAnno2" class="com.persia.PersonDaoBean"></bean>

<!-- 自动注解 -->
<bean id="personServiceAutoInject" class="com.persia.PersonServiceAutoInject" autowire="byName"></bean>


<bean id="personService" class="com.persia.PersonServiceBean">
<!-- 由spring容器去创建和维护,我们只要获取就可以了 -->
</bean>

<bean id="personService2" class="com.persia.PersonServiceBeanFactory" factory-method="createInstance" lazy-init="true" 
      init-method="init"  destroy-method="destory">
<!-- 静态工厂获取bean -->
</bean>

<bean id="fac" class="com.persia.PersonServiceBeanInsFactory"></bean>
<bean id="personService3" factory-bean="fac" factory-method="createInstance" scope="prototype">
<!-- 实例工厂获取bean,先实例化工厂再实例化bean-->
</bean>


<!-- ref方式注入属性 -->
<bean id="personDao" class="com.persia.PersonDaoBean"></bean>
<bean id="personService4" class="com.persia.PersonServiceBean">
  <property name="personDao" ref="personDao"></property>
</bean>

<!-- 内部bean方式注入 -->
<bean id="personService5" class="com.persia.PersonServiceBean">
  <property name="personDao">
     <bean class="com.persia.PersonDaoBean"></bean>
  </property>
  <property name="name" value="persia"></property>
  <property name="age" value="21"></property>
  
  <property name="sets">
    <!-- 集合的注入 -->
     <set>
       <value>第一个</value>
       <value>第二个</value>
       <value>第三个</value>
     </set>
  </property>
  
  <property name="lists">
    <!-- 集合的注入 -->
    <list>
        <value>第一个l</value>
       <value>第二个l</value>
       <value>第三个l</value>
    </list>
    
  </property>
  
  <property name="properties">
    <props>
      <prop key="key1">value1</prop>
      <prop key="key2">value2</prop>
      <prop key="key3">value3</prop>
    </props>
  </property>
  
  <property name="map">
   <map>
      <entry key="key1" value="value-1"></entry>
      <entry key="key2" value="value-2"></entry>
      <entry key="key3" value="value-3"></entry>
   </map>
  </property>
</bean>

<bean id="personService6" class="com.persia.PersonServiceBean">
   <constructor-arg index="0" value="构造注入的name" ></constructor-arg>
   <!-- 基本类型可以不写type -->
   <constructor-arg index="1" type="com.persia.IDaoBean" ref="personDao">
   </constructor-arg> 
</bean>
 

其中的注解配置:有@Autowired和@Resource形式,二者都可以注解在字段和setter上面,

其中注解在字段上面不需要提供setter方法。

clip_image002[7]

@Autowired默认按类型装配,也可添加@Qualifier改为按名称装配。

@Resource 默认按名称装配。

需要的jar包:

clip_image002[9]

注意xml的配置:

<context:annotation-config>
<!--开启注解处理器-->
</context:annotation-config>
<!-- 使用注解,省去了propertity的xml配置,减少xml文件大小 -->
<bean id="personServiceAnno" class="com.persia.PersonServiceAnnotation"></bean>
<bean id="personDaoBeanAnno" class="com.persia.PersonDaoBean"></bean>
<bean id="personDaoBeanAnno2" class="com.persia.PersonDaoBean"></bean>
注意前面引入的空间:
<?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:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	                   http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	                   http://www.springframework.org/schema/context
	                   http://www.springframework.org/schema/context/spring-context-2.5.xsd
	                   ">
注意代码里面的写法:
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;;

public class PersonServiceAnnotation implements IService {

//	@Resource
//	private IDaoBean personDaoBeanAnno;
	@Autowired @Qualifier("personDaoBeanAnno")
	private IDaoBean personDaoBeanAnno;
	private String name;
	private IDaoBean personDaoBeanAnno2;
	

	public void save() {
		// TODO Auto-generated method stub
		System.out.println("使用字段和setter注解");
		personDaoBeanAnno.add();
		
		personDaoBeanAnno2.add();

	}
	
    @Resource
	public void setPersonDaoBeanAnno2(IDaoBean personDaoBeanAnno2) {
		this.personDaoBeanAnno2 = personDaoBeanAnno2;
	}




	public List<String> getLists() {
		// TODO Auto-generated method stub
		return null;
	}

	public Map<String, String> getMap() {
		// TODO Auto-generated method stub
		return null;
	}

	public Properties getProperties() {
		// TODO Auto-generated method stub
		return null;
	}

	public Set<String> getSets() {
		// TODO Auto-generated method stub
		return null;
	}

}

三、自动装配

clip_image002[11]

注意,按类型查找,若有多个相同的类型,则spring不知道要用哪个,会抛出异常。

注意自动装配需要提供setter方法。对比手工装配的注解,其中若注解在字段上不需要提供setter,

若注解在方法上则需要提供setter方法。

只要统一提供setter方法即可。

<!-- 自动注解 -->
<bean id="personServiceAutoInject" class="com.persia.PersonServiceAutoInject" autowire="byName">
</bean>
  /**
   * 自动注解
  **/
	  IService s3=(IService) ctx.getBean("personServiceAutoInject");
	  s3.save();

posted on 2009-07-20 13:17  cxccbv  阅读(812)  评论(0编辑  收藏  举报

导航