Spring视频学习(四)Spring手工和自动注解
一、依赖注入的形式:
二、其中的手工装配:
分: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方法。
@Autowired默认按类型装配,也可添加@Qualifier改为按名称装配。
@Resource 默认按名称装配。
需要的jar包:
注意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; } }
三、自动装配
注意,按类型查找,若有多个相同的类型,则spring不知道要用哪个,会抛出异常。
注意自动装配需要提供setter方法。对比手工装配的注解,其中若注解在字段上不需要提供setter,
若注解在方法上则需要提供setter方法。
只要统一提供setter方法即可。
<!-- 自动注解 --> <bean id="personServiceAutoInject" class="com.persia.PersonServiceAutoInject" autowire="byName">
</bean>
/**
* 自动注解
**/ IService s3=(IService) ctx.getBean("personServiceAutoInject"); s3.save();