Spring实践第三天 (SpringDI:依赖注入)

梦想与她 提交于 2020-02-12 01:53:23

如下图,昨天已经进行过依赖注入,

 今天的项目实践如果看不懂就请参考我昨天实践写的博文:

Spring实践第三天 (SpringDI:依赖注入)

 

1.什么是自动装配?

自动装配即无需配置类之间的依赖关系!

基于xml实现bean的自动装配,也就是红框里对依赖的手动配置都要删掉不要了。

 

2.怎样自动装配?(原理)

依赖注入方式:手动装配和自动装配

手动装配:一般通过配置xml文件来完成关系装配,比如构造方法,setter方法

自动装配:

  • byType:按类型装配
  • byName:按名称装配,需要一个setter方法
<bean id="UserService" class="com.nenu.service.impl.UserServiceImpl" autowire="byName">

首先要在applicationContext.xml配置文件中指明autowire的属性(即自动装配的方法)

其次在UserService接口的实现类UserServiceImpl中添加对应的setter或constructor!

 看不懂没关系,下面我们开始举例进行自动装配!

 

 

一、xml实现bean自动装配的三种方式

 

1.constructor

首先applicationContext.xml改为:

<?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-3.0.xsd">

    <!-- Spring配置依赖关系,两种方法任选其一 -->
    <bean id="UserService" class="com.nenu.service.impl.UserServiceImpl" autowire="constructor">
        <!--第一种方式:setter方法-->
        <!--<property name="userDao" ref="UserDao"/>-->
        <!--第二种方式-->
        <!--<constructor-arg name="userDao" ref="UserDao"/>-->
    </bean>

    <bean id="UserDao" class="com.nenu.dao.impl.UserDaoImpl"/>

</beans>

其次在UserServiceImpl中添加constructor方法,即:

    public UserServiceImpl(){}

进行测试:

成功!!!

 

 

2.byType

首先applicationContext.xml改为:

<?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-3.0.xsd">

    <!-- Spring配置依赖关系,两种方法任选其一 -->
    <bean id="UserService" class="com.nenu.service.impl.UserServiceImpl" autowire="byType">
        <!--第一种方式:setter方法-->
        <!--<property name="userDao" ref="UserDao"/>-->
        <!--第二种方式-->
        <!--<constructor-arg name="userDao" ref="UserDao"/>-->
    </bean>

    <bean id="UserDao" class="com.nenu.dao.impl.UserDaoImpl"/>

</beans>

其次在UserServiceImpl中添加setter方法,即:


//这是一个setter方法,设置userDao属性的值public void setUserDao(UserDaoImpl userDao) {    this.userDao = userDao;}

测试:

成功!!!

 

 

3.byName

首先applicationContext.xml改为:

<?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-3.0.xsd">

    <!-- Spring配置依赖关系,两种方法任选其一 -->
    <bean id="UserService" class="com.nenu.service.impl.UserServiceImpl" autowire="byName">
        <!--第一种方式:setter方法-->
        <!--<property name="userDao" ref="UserDao"/>-->
        <!--第二种方式-->
        <!--<constructor-arg name="userDao" ref="UserDao"/>-->
    </bean>

    <bean id="userDao" class="com.nenu.dao.impl.UserDaoImpl"/>

</beans>

PS:注意这里bean id从UserDao改为了userDao(大小写问题),为了与UserServiceImpl中的userDao对象名称对应

其次在UserServiceImpl中添加setter方法,即:


//这是一个setter方法,设置userDao属性的值public void setUserDao(UserDaoImpl userDao) {    this.userDao = userDao;}

测试:

成功!!!

 

 

4.实验

那么byName和ByType有何区别?下面我们做两个实验:

实验一:

 把UserDao的bean的配置删掉,发现这三种配置方式的测试结果不通过,显示空指针。

也就是这句话:

<bean id="userDao" class="com.nenu.dao.impl.UserDaoImpl"/>

实验二:

  把setter方法的方法名修改掉,发现byName测试不通过,byType可以通过测试:

也就是把setter方法改为:

    //这是一个setter方法,设置userDao属性的值
    public void setUserDao2(UserDaoImpl userDao) {
        this.userDao = userDao;
    }

也就是byName找名称一样的,byType找类型符合的。

 

 

二、如果xml文件中指定一种自动配置方式,就不需要挨个bean配置,只在beans标签中加入即可:

例如加入default-autowire

<?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-3.0.xsd" default-autowire="byName">

 

 

三、总结


 基于实现xml的bean的自动装配这个小知识点就到此为止啦hhh,小伙伴们有问题欢迎一起探讨!加油~

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!