Spring:依赖注入(注解方式)

来源:互联网 发布:上山下乡知乎 编辑:程序博客网 时间:2024/05/16 13:43

注解方式实现依赖注入支持手工装配和自动装配(慎用)

一般是声明bean和bean直接的依赖关系的时候用比较好

使用注解方式时,也支持给Field注入值(在XML中不可以给Field注入)。另外就是setter方式注入。

@Resource注解在spring安装目录的lib\j2ee\common-annotations.jar


注解方式必须

1、 引入context命名空间。

2、 在配置文件中添加context:component-scan标签。多个包的时候,可以用逗号隔开。(表示把这些对象纳入容器管理)

<?xmlversion="1.0"encoding="UTF-8"?>

<beansxmlns="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/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd

              http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-2.5.xsd">

          

    <!--设置为自动扫描与装配bean,扫描指定包及其所有下级包中的类,可以写多个,之间用英文的逗号隔开 -->   

<context:component-scanbase-package="cn.itcast"></context:component-scan>

   

</beans>

spring2.5为我们引入了组件自动扫描机制,它可以在类路径底下寻找标注了@Component@Service@Controller@Repository注解的类并把这些类纳入进spring容器中管理。它的作用和在xml文件中使用bean节点配置组件是一样的。

功能介绍:

@Service用于标注业务层组件、

@Controller用于标注控制层组件(如struts中的action)、

@Repository用于标注数据访问组件,即DAO组件。

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。


@Scope用于指定当前bean的作用域,是使用prototype还是singleton。


这需要通过@Resource注解实现,@Resource注解可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resourcename属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。

@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。如果没有指定name属性,并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

例如:

@Resource(name="personDao")

private PersonDao personDao;;//用于字段上

@Resource(name="personDao")

public void setPersonDao(PersonDao personDao) {//用于属性的set方法上

      this.personDao = personDao;

}

后一种相当于xml配置文件中的

<property name=“personDao"ref="personDao" />


自动装配

<beanid=“foo” class=“...Foo” autowire=“autowiretype”>

 autowire属性取值如下

 

*  byType:按类型装配,可以根据属性的类型,在容器中寻找跟该类型匹配的bean。如果发现多个,那么将会抛出异常。如果没有找到,即属性值为null。

 

 * byName:按名称装配,可以根据属性的名称,在容器中寻找跟该属性名相同的bean,如果没有找到,即属性值为null。

 

*constructor与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。

 

*autodetect :首先尝试使用constructor来自动装配,然后使用byType方式。不确定性的处理与constructor方式和byType方式一致。(通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式。)

 

在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

也可以使用autowire注解自动实现注入,它按照类型匹配,也可以结合required注解实现按照名字匹配,这个是spring提供的注解,而resource注解是javaee提供的注解

用谁一目了然。



0 0