Spring依赖注入(基于XML配置文件和Annotation的方式完成属性装配)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36271806/article/details/53390389

依赖注入的方式(手工装配):
1.使用bean的构造器注入—基于XML方式
2.使用属性setter方法注入—基于XML方式
3.使用field注入—基于Annotation方式
注入依赖对象可采用手工装配和自动装配,在实际应用中建议使用手工装配,自动装配会产生未知情况,且无法预知装配结果

使用构造器方式注入:

// 提供构造方法
    public PersonServiceBean(PersonDao personDao, String name) {
        this.personDao = personDao;
        this.name = name;
    }


    @Override
    public void save() {

        System.out.println(name);
        personDao.add();
    }

    public void destory() {
        System.out.println("关闭打开的资源");
    }
<!--在bean中子元素的配置如下-->
 <constructor-arg index="0" type="cn.itcast.dao.PersonDao" ref="personDao"></constructor-arg>
    <constructor-arg index="1" value="jxlgdx"></constructor-arg>

手工装配依赖对象:两种方式
1.在xml配置文件中,通过在bean节点下的配置,代码如下

    <bean id="personService" class="cn.itcast.service.impl.PersonServiceBean">
        <!-- id属性中不能有特殊字符,name属性可以有 -->   
    <!-- 构造器注入 -->
    <constructor-arg index="0" type="cn.itcast.dao.PersonDao" ref="personDao"/>
    <constructor-arg index="1" type="String" value="jxlgdx"/>    
    <!-- 属性setter方法注入 -->
    <property name="name" value = "zhangsan"></property>
    </bean> 

2.在java code中使用@Autowired或@Resource注解方式进行装配(推荐使用Resource),但使用注解方式需要在xml文件中配置如下信息,
*
@Resource是JDK中自带的注解,而@Autowired是Spring Framework提供的,为了方便解耦,推荐使用Resource*

<?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.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config/>

在java代码上使用注解时,可以写在字段上也可以写在set方法上

@Resource
    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }//写在set方法上

public class PersonServiceBean implements PersonService {
    @Resource private PersonDao personDao;
    private String name;//写在字段上

PS:在用junit测试时,出现一个bug,最后在网上才找到解决办法,如下:
关于 AnnotationConfigBeanDefinitionParser are only available on JDK 1.5 and higher
修改IDE使用的JDK版本可百度找到,这个使用annotation完成bean属性装配也由于bug弄了一早上,汗颜。。。

Annotation:配置的作用,注解代表某一种业务意义,注解背后的处理器才有实际作用:先解析所有属性,根据搜索规则,如果能match上,则取得bean,通过反射技术注入

另一种注解@Autowired的使用:
1.@Autowired默认按照类型装配,@Resource默认按照名称装配,当找不到与名称匹配的bean才会按照类型装配(@Resource的名称可以通过name属性指定,如果没有name属性则默认取字段的名称作为bean的名称寻找依赖对象,当注解使用在setter方法上面时,默认区属性名作为bean的名称寻找依赖对象)

PS:@Reource,若没有指定name属性,并且按照默认名称也找不到依赖对象时,注解会自动根据类型装配,但一旦指定了name属性后,则在只能按照名称装配

自动装配(不推荐使用,会产生不可预知的结果)
例子如下,aotuwire属性取值有多种,详细见API文档

<bean id="xxx" class="yyy.yyy" autowire="byType"/>
阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页