MVC模型_annotation (注解模式)

自动装配

说明

Spring基于resources目录xml配置文件 为了让属性(对象的引用)注入更加的简单,则推出了自动装配模式。注:自动装配只能为对象的引用赋值,不能给例如String类型等赋值

  1. 根据名称自动装配
  2. 根据类型自动装配
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--1、构建user对象,POJO对象是用来封装业务属性的,该对象通过Di注入要传给Controller,然后一直传到DAO层并写入数据库-->
    <bean id="user" class="ink.pingdu.pojo.User">
        <!--根据name属性查找对象user的setId()方法,将value当做参数调用set方法完成赋值
            注意:user只是基本的包装类,不是引用对象,所以该类的属性根据用户需求,想赋值
            什么都可以,所以像这类属性,spring没有做自动装配,spring不管。
            -->
        <property name="id" value="100"></property>
        <property name="name" value="springMVC设计模式"></property>
    </bean>

    <!--2、构建Dao对象(与User对象不能有关系,本对象没有话语权,数据是由service传过来,所以上层还得构建Service与自己关联)
            根据面向接口编程书写规范:Id 必须写接口的名称 class 必须写实现类的包路径
            注意:DaoService的引用对象,所以在service类中对dao的属性赋值时,spring可以优化为自动装配。
            -->
    <bean id="userDao" class="ink.pingdu.dao.UserDaoImpl"></bean>

    <!--3、构建Service(要把数据传递给Dao,所以在Service中需要Dao对象,所以Spring会通过Set方法给Service注入Dao对象)
            书写规范同Dao
            但是要注意:因为Service要与Dao有关联所以Service就会有一个Dao,做为Service的属性,有属性就得为它赋值
            因为赋的不是一个具体的值,而是要赋予的是一个UserDao对象,所以不用Value,而是用ref(引用)
            自动装配:程序无需手动的编辑property属性(注释掉的部分),只需加属性:autowire="byName" 根据属性名称进行注入
            autowire=“byName” 自动注入原理:
                1)通过反射从class="ink.pingdu.service.UserServiceImpl"中找到对象的所有的set方法,从中拿到setUserDao()
                2)把setUserDao()方法名通过规则(去掉set、首字母小写)加工获取属性名称userDao。问一问:为什么不直接通过反射拿到属性,
                  而是要通过方法转换? 答:因为注入要么构造要么set方法,但是set方法用得多,所以要注入必须有set方法,如果没有set方法
                  就算我拿到属性也是无法注入的,所以通过set方法来获取属性,能有效保障成功注入,如果发现没有set方法,就不自动注入了。
                3Spring会根据对象的属性查询自己维护的Map集合(bean的id为k,v就是根据class实例化出来的对象),根据userDao名称,
                  查找Map中的key与之对应,如果匹配成功,则能自动调用set方法实现注入(必须有set方法)

            autowire=“byType” 自动注入原理:
                1)通过反射从class="ink.pingdu.service.UserServiceImpl"中找到对象的所有的set方法,从中拿到setUserDao()
                2) 根据setUserDao()方法找到方法中参数的类型UserDao.class
                3Spring根据自己维护对象(维护的集合kv结构,通过id拿到对象,对象.getClass可以获得对象类型(class))的类型(Class)
                   进行匹配,如果匹配成功则实现set方法注入

            autowire:规则:如果配置了byName则首先安照name查找,如果查找不到,则按照byType方式查找。未来一般首选类型查找。
            -->
    <bean id="useService" class="ink.pingdu.service.UserServiceImpl" autowire="byName">
<!--        <property name="userDao" ref="userDao"></property>-->
    </bean>

    <!--4、构建Controller(User对象本来是由前端传入,但是本次测试我们自己给User赋值,User对象注入给Controller后
            把数据传下去,一直传到Dao层,写入数据库。)
        注意:编写规范一样。另该类有两个属性需要注入
        -->
    <bean id="userController" class="ink.pingdu.controller.UserController" autowire="byType">
<!--        <property name="userService" ref="useService"></property>-->
<!--        <property name="user" ref="user"></property>-->
    </bean>
<!--注意:UserController用 byName会空指针异常,用byType才能运行,目前还没有找到原因!!!!-->
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值