Spring注解:
1.准备工作:
1):导入common-annotation.jar包
2):导入schema文件
3):配置web.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"
default-default-lazy-init="true">
<!--将针对注解的处理器配置好 -->
<context:annotation-config />
<!-- 使用annotation定义事务-->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/>
<!--使用annotation 自动注册bean,并检查@Required,@Autowired的属性已被注入base-package为需要扫描的包(含所有子包)-->
<context:component-scan base-package="com" />
.....
<beans>
注1:<context:component-scan base-package="*.*"/>
该配置隐式注册了多个对注解进行解析的处理器:
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor
其实,注解本身除了和xml一样起到配置作用外,并不做任何事情;主要在于背后强大的处理器,其中就包括了<context:annotation-config/>配置项里的注解所使用的处理器
所以配置了<context:component-scan base-package="*.*"/>就无需再配置<context:annotation-config/>;
注2:在Java中通常使用@Resource和@Autowired进行装配;
它们的区别是:1):@Resource默认按名称装配,找不到是再按类型装配;@Autowired只是按类型装配
2):@Autowired一般装配在set方法上;当Spring上下文不存在或者不止一个所要装配的类型的时候使用@Autowired都会报错,这是可以采用如下对应方法:
- 当Spring上下文可能不存在时,使用@Autowiredwired(required = false),此时即使找不到也不会报错:
@Autowired(required = false) public void setUserDao(UserDao userDao) { this.userDao = userDao; }
- 当Spring上下文不止一个所要装配的类型时,可以结合@Qualifier使用来指定需要注入Bean的名称:
此时只会注入ID=“userDao”的Bean;同时@Qualifier还可以用在成员变量和构造参数上@Autowired public void setUserDao(@Qualifier("userDao") UserDao userDao) { this.userDao = userDao; }
public class Boss { @Autowired private Car car; @Autowired @Qualifier("office") private Office office; @Autowired public Boss(Car car , @Qualifier("office")Office office){ this.car = car; this.office = office ; } }
最后:
@Resource装配顺序
1 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型(UserDao)
进行匹配,如果匹配则自动装配;