<?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:annotation-config/>
</beans>
其中<context:annotation-config />的作用是在给Spring的容器注册了四个类,包括(AutowiredAnnotationBeanPostProcessor , CommonAnnotationBeanPostProcessor , PersistenceAnnotationBeanPostProcessor 和 RequiredAnnotationBeanPostProcessor),这几个类都是为了处理相应的注解。
(1)@Autowired
此注解的作用是为了Spring在进行自动装配时调用的方法,可以注解在 对应属性上,对应属性的set方法上,和任意名字的方法上,可以注解多个,当存在多个此注解时,会多次调用注解了的方法。
例如:
package cn.mastery.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import cn.mastery.dao.BaseDao;
public class BaseService extends LifeCycle {
@Autowired
private BaseDao baseDao;
public BaseDao getBaseDao() {
return baseDao;
}
@Autowired
public void setBaseDao(BaseDao baseDao) {
this.baseDao = baseDao;
}
//调用加在此注解上的方法来动态装载,也可加在属性声明处,可不需要set和get方法
@Autowired
public void wired(BaseDao baseDao) {
this.baseDao = baseDao;
}
public Boolean add(Object entity){
System.out.println(this.baseDao);
return baseDao.add(entity);
}
public Boolean update(Object entity){
return baseDao.update(entity);
}
public Boolean delete(Object entity){
return baseDao.delete(entity);
}
public List<Object> query(){
return baseDao.query();
}
}
(2)@Qualifier
此注解的作用是为了Spring在进行自动装配时当配置xml时存在多个相同的bean时,Spring无法自动识别出调用的是哪个bean,配上这个注解可以让Spring的容器能够找到对应的bean之后赋值。
例如:
package cn.mastery.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import cn.mastery.dao.BaseDao;
public class BaseService extends LifeCycle {
private BaseDao baseDao;
public BaseDao getBaseDao() {
return baseDao;
}
public void setBaseDao(BaseDao baseDao) {
this.baseDao = baseDao;
}
//调用加在此注解上的方法来动态装载,也可加在属性声明处,可不需要set和get方法
@Autowired
public void wired(@Qualifier("action")BaseDao baseDao) {
this.baseDao = baseDao;
}
public Boolean add(Object entity){
System.out.println(this.baseDao);
return baseDao.add(entity);
}
public Boolean update(Object entity){
return baseDao.update(entity);
}
public Boolean delete(Object entity){
return baseDao.delete(entity);
}
public List<Object> query(){
return baseDao.query();
}
}
xml配置如下:如上@Qualifier的后面名字是action,则Spring容器调用的是id为baseDao1的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">
<context:annotation-config></context:annotation-config>
<!-- 此配置的autowire说明是通过名字来匹配! 则匹配的是第一个bean -->
<bean id="baseDao" class="cn.mastery.dao.impl.BaseDaoImpl">
<qualifier value="main"></qualifier>
<property name="daoId" value="8"></property>
<property name="daoStatus" value="good"></property>
</bean>
<!-- 此配置的autowire说明是通过名字来匹配! 则匹配的是第一个bean -->
<bean id="baseDao1" class="cn.mastery.dao.impl.BaseDaoImpl">
<qualifier value="action"></qualifier>
<property name="daoId" value="2"></property>
<property name="daoStatus" value="bad"></property>
</bean>
<bean id="baseService" class="cn.mastery.service.BaseService">
</bean>
<!-- more bean definitions go here -->
</beans>