Spring框架值注解

注解配置概括

Spring可以按指定的包路径扫描内部的组件,当发现组件类定义前有一下的注解标记,会将该组件纳入Spring容器中。
1)@Component(其他组件)
2)@Controller(Action组件,负责调Service)
3)@Service(Service组件,负责调DAO,处理一些额外逻辑)
4)@Repository(DAO组件,负责访问数据库)

一,引出问题:

当有很多bean需要加入到配置文件时,比如下面:

    <bean id="hbCostDAO" scope="singleton" lazy-init="true"
        init-method="myinit" destroy-method="mydestroy" class="cn.unis.dao.HbCostDAO"></bean>
    <bean id="mybatisCostDAO" scope="singleton" lazy-init="true"
        init-method="myinit" destroy-method="mydestroy" class="cn.unis.dao.MyBatisCostDAO"></bean>
    <bean id="jdbcCostDAO" scope="singleton" lazy-init="true"
        init-method="myinit" destroy-method="mydestroy" class="cn.unis.dao.JdbcCostDAO">
    </bean>

随着越来越多的baen需要加入,那么这样会越来月不美观,所以,我们就引入了注解,使用注解只需要一句话

<context:component-scan base-package="cn.unis.dao"></context:component-scan>

这句话表示要注入cn.unis.dao下所有的bean。这就是注解。

虽然在配置文件里简单了,相应的代价就是要在类中来说明哪些是注解。

首先我们来看一些约定:(这里约定大于编码,也就是说都按照框架的约定,我们可以少很多coding)

1,类名和变量名要规范,首字母大写,第二个字母必须小写,否则在使用时会出现冲突或无法识别

2,将bean扫描进spring容器后,默认的bean对应的id就是类名首字母小写,如果需要自定义名字,可以在@注解("自定义名字")

3,默认的scope是singleton,如果需要改变,可以使用@Scope("prototype")定义

如果容器中两个符合要求可被注入同一个组件的Bean对象,可以采用下面注解标记:

1)@Resource,默认按类型匹配注入(JDK自带的)。若有多个符合要求的类型,则报错:匹配不唯一,那么就需要采取按名称注入的方式,它的使用格式为:

                    @Resource(name="需要注入的Bean对象id值")。

2)@Autowired,默认按类型匹配注入(Spring提供的)。若有多个符合要求的类型,则采取按名称注入的方式,它的使用格式为:

                    @Autowired

                    @Qualifier("需要注入的Bean对象id值")

 注意事项:注入标记在成员变量定义前,但@Resource也可以在set方法前使用!

案例:id为hibernateCostDao的Bean对象和id为costDao的Bean对象,都符合CostDAO接口,在CostAction组件中注入,那么此时将会报错:匹配不唯一。解决如下:
step1:修改CostActin,添加注入标记
@Controller("costAction")
@Scope("prototype")
public class CostAction {
       //@Resource//将costDao注入,按类型匹配注入,JDK自带的
       //@Autowired//将costDao注入,按类型匹配注入,Spring提供的
       //@Resource(name="hibernateCostDao")//当有多个符合要求的类型,则按名称注入
       @Autowired
       @Qualifier("hibernateCostDao")//当有多个符合要求的类型,则按名称注入
       private CostDAO costDAO;
       public void setCostDAO(CostDAO costDAO) {   this.costDAO = costDAO;     }
原文地址:https://www.cnblogs.com/ningheshutong/p/6229935.html