set注入和构造注入"/>
set注入和构造注入
2023.11.8
控制反转是一种思想,有利于降低程序耦合度,提高程序扩展力。控制反转,反转的是:
- 将对象的创建权利交出去,交给第三方容器负责。
- 将对象和对象之间关系的维护权交出去,交给第三方容器负责。
而依赖注入实现了控制反转的思想。Spring通过依赖注入的方式来完成Bean管理。
依赖注入常见的实现方式包括两种:
- 第一种:set注入
- 第二种:构造注入
本章对两种注入方式进行一个实现。
set注入
创建持久层UserDao:
package spring6.dao;import org.slf4j.LoggerFactory;
import org.slf4j.Logger;public class UserDao {private static final Logger logger = LoggerFactory.getLogger(UserDao.class);public void insert(){logger.info("数据库正在保存用户信息!");}
}
创建逻辑层UserService:
package spring6.service;import spring6.dao.UserDao;public class UserService {private UserDao userDao;//使用set注入,必须提供一个set方法public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void saveUser(){userDao.insert();}
}
接下来需要在spring.xml中配置bean文件:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi=""xsi:schemaLocation=" .xsd"><bean id="userBean" class="spring6.dao.UserDao"></bean><!-- 想让spring调用对应的set方法,需要配置property标签。-->
<!-- name属性的值为:set方法名去掉set,再将剩下的单词首字母变小写。-->
<!-- ref指定的是要注入的bean的id--><bean id="userServiceBean" class="spring6.service.UserService"><property name="userDao" ref="userBean"/></bean>
</beans>
测试程序:
@Testpublic void testSetDI(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");UserService userService = applicationContext.getBean("userServiceBean", UserService.class);userService.saveUser();}
运行结果:
构造注入
再准备一个持久层OrderDao:
package spring6.dao;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class OrderDao {private static final Logger logger = LoggerFactory.getLogger(UserDao.class);public void deleteById(){logger.info("数据库正在删除订单!");}
}
逻辑层:OrderService:
package spring6.service;import spring6.dao.OrderDao;
import spring6.dao.UserDao;public class OrderService {private OrderDao orderDao;private UserDao userDao;//通过反射机制调用构造方法给属性赋值public OrderService(OrderDao orderDao, UserDao userDao) {this.orderDao = orderDao;this.userDao = userDao;}public void delete(){orderDao.deleteById();userDao.insert();}
}
新的xml文件:这里的构造注入方式的配置有两种。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns=""xmlns:xsi=""xsi:schemaLocation=" .xsd"><bean id="userDaoBean" class="spring6.dao.UserDao"/><bean id="orderDaoBean" class="spring6.dao.OrderDao"/><!-- 构造注入①,第一个参数是0,第二个参数是1-->
<!-- <bean id="orderServiceBean" class="spring6.service.OrderService">-->
<!-- <constructor-arg index="0" ref="orderDaoBean"/>-->
<!-- <constructor-arg index="1" ref="userDaoBean"/>-->
<!-- </bean>-->
<!-- 构造注入②,使用参数的名字也可以--><bean id="orderServiceBean" class="spring6.service.OrderService"><constructor-arg name="orderDao" ref="orderDaoBean"/><constructor-arg name="userDao" ref="userDaoBean"/></bean>
</beans>
测试代码:
@Testpublic void testConstructorDI(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml");OrderService orderServiceBean = applicationContext.getBean("orderServiceBean", OrderService.class);orderServiceBean.delete();}
运行结果:
更多推荐
set注入和构造注入
发布评论