如下图,昨天已经进行过依赖注入,
今天的项目实践如果看不懂就请参考我昨天实践写的博文:
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,小伙伴们有问题欢迎一起探讨!加油~
来源:https://www.cnblogs.com/yangf428/p/12297540.html