Spring依赖注入

x33g5p2x  于2022-04-17 转载在 Spring  
字(6.4k)|赞(0)|评价(0)|浏览(484)

依赖注入概念

将UserDao注入到UserService内部的方式

set注入方法改进

有参构造注入方法

Bean的依赖注入的数据类型

集合的数据类型注入

引入其他配置文件(分模块开发)

Spring的重点配置

依赖注入概念

上面的缺点也很明显,是同时获取service和dao层的到时我们只想要service层,所以此时,需要依赖注入,把dao注入到service服务层
依赖注入(DependencyInjection):它是Spring框架核心IOC的具体实现。

在编写程序时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况。 IOC解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。

那这种业务层(Service)和持久层(Dao)的依赖关系,在使用Spring之后,就让Spring来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取

将UserDao注入到UserService内部的方式

构造方法和set方法

法1:set方法

在UserServiceImpl下创建userDao

  1. import com.Dao.UserDao;
  2. import com.Service.UserService;
  3. public class UserServiceImpl implements UserService {
  4. private UserDao userDao;
  5. public void setUserDao(UserDao userDao) {
  6. this.userDao = userDao;
  7. }
  8. @Override
  9. public void save() {
  10. userDao.save();
  11. }
  12. }

在applicationContext.xml文件中配置

  1. <bean id="userDao" class="com.Dao.impl.UserDaoImpl"></bean>
  2. <bean id="userService" class="com.Service.Impl.UserServiceImpl">
  3. <property name="userDao" ref="userDao"></property>
  4. </bean>

然后之前创建的UserController就可以启动了

如果直接new UserServiceImpl对象会报空指针异常的错,

因为useDao是不是通过spring容器来获取的,自然就是null值了

set注入方法改进

P命名空间注入本质也是set方法注入,但比起上述的set方法更加方便,首先需要引入p命名空间:

  1. xmlns:p="http://www.springframework.org/schema/p"

修改注入方式

  1. <bean id="userService" class="com.Service.Impl.UserServiceImpl" p:userDao-ref="userDao">

是一个对象就用-ref,普通属性就不用

userController运行之后

 有参构造注入方法

在applicationContext.xml文件中

  1. <bean id="userService" class="com.Service.Impl.UserServiceImpl">
  2. <!-- name后的userDao表示构造内部的参数名,ref表示引用容器bean的id-->
  3. <constructor-arg name="userDao" ref="userDao"></constructor-arg>
  4. </bean>

userServiceImpl下 

运行结果:

Bean的依赖注入的数据类型

上面的操作,都是注入引用Bean,除了对象的引用可以注入,普通数据类型,集合都可以在容器中进行注入。

注入数据的三种数据类型

  • 普通数据类型
  • 引用数据类型
  • 集合数据类型

普通数据注入,如在UserDao层注入两个普通数据类型(采用set方式注入)

  1. public class UserDaoImpl implements UserDao {
  2. private String name;
  3. private int age;
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. public void setAge(int age) {
  8. this.age = age;
  9. }
  10. public void save(){
  11. System.out.println("姓名:"+name+"年龄:"+age);
  12. System.out.println("run save...");
  13. }
  14. }

在applicationContext.xml文件中,在配置dao中设置参数

  1. <bean id="userDao" class="com.Dao.impl.UserDaoImpl">
  2. <property name="name" value="李四"/>
  3. <property name="age" value="20" />
  4. </bean>

在Usercontroller下

  1. public class UserController {
  2. public static void main(String[] args) {
  3. ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
  4. UserService userService = (UserService) app.getBean("userService");
  5. userService.save();
  6. }
  7. }

运行结果

集合的数据类型注入

在UserDaoImpl下
采用set注入方式,设置集合,提供对应得set方法

  1. package com.Dao.impl;
  2. import com.Dao.UserDao;
  3. import com.pojo.User;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Properties;
  7. public class UserDaoImpl implements UserDao {
  8. private List<String> strList;
  9. private Map<String, User> userMap;
  10. private Properties properties;
  11. public void setStrList(List<String> strList) {
  12. this.strList = strList;
  13. }
  14. public void setUserMap(Map<String, User> userMap) {
  15. this.userMap = userMap;
  16. }
  17. public void setProperties(Properties properties) {
  18. this.properties = properties;
  19. }
  20. public void play(){
  21. System.out.println("play and play...");
  22. }
  23. public void save(){
  24. System.out.println("List集合-》"+strList);
  25. System.out.println("Map集合-》"+userMap);
  26. System.out.println("properties集合-》"+properties);
  27. System.out.println("run save...");
  28. }
  29. }

在applicationContext.xml下配置注入值

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!--<bean id="userDao" class="com.Dao.impl.UserDaoImpl">-->
  7. <!-- <property name="name" value="李四"/>-->
  8. <!-- <property name="age" value="20" />-->
  9. <!--</bean>-->
  10. <bean id="userDao" class="com.Dao.impl.UserDaoImpl">
  11. <!--给list集合注入值 -->
  12. <property name="strList" >
  13. <list>
  14. <value>慧慧</value>
  15. <value>孔超</value>
  16. <value></value>
  17. </list>
  18. </property>
  19. <property name="userMap">
  20. <map>
  21. <!--key表示map里的key,value-ref是对象的引用,引用id为user1和user2 -->
  22. <entry key="宝1" value-ref="user1"></entry>
  23. <entry key="宝2" value-ref="user2"></entry>
  24. </map>
  25. </property>
  26. <!-- 给properties注入的值 -->
  27. <property name="properties">
  28. <props>
  29. <prop key="p1">宝1</prop>
  30. <prop key="p2">宝2</prop>
  31. </props>
  32. </property>
  33. </bean>
  34. <!-- 这是给map对象的user设置的值的-->
  35. <bean id="user1" class="com.pojo.User">
  36. <property name="name" value="慧慧"/>
  37. <property name="address" value="赣州"/>
  38. </bean>
  39. <bean id="user2" class="com.pojo.User">
  40. <property name="name" value="孔超"/>
  41. <property name="address" value="赣州"/>
  42. </bean>
  43. <bean id="userService" class="com.Service.Impl.UserServiceImpl">
  44. <!-- name后的userDao表示构造内部的参数名,ref表示引用容器bean的id-->
  45. <constructor-arg name="userDao" ref="userDao"></constructor-arg>
  46. </bean>
  47. </beans>

在UserController测试下

  1. import com.Service.UserService;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. public class UserController {
  5. public static void main(String[] args) {
  6. ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
  7. UserService userService = (UserService) app.getBean("userService");
  8. userService.save();
  9. }
  10. }

运行结果: 

 引入其他配置文件(分模块开发)

实际开发中,Spring的配置内容非常的多,这就导致Spring配置很繁琐且体积很大,所以可以将部分配置拆解到其他配置文件中,而且主配置文件通过import标签进行加载

语法格式:

  1. <import resource="xxxx.xml"/>

Spring的重点配置

<bean>标签

  • id属性:在容器中Bean实例的唯一标识,不允许重复
  • class属性:要实例化的Bean的全限定名
  • scope属性:bean的作用范围,常用是Singleton(默认)和prototype

**<property>标签:**属性注入

  •         name属性:属性名称
  •         value属性:注入的普通属性值
  •         ref属性:注入的对象引用值

<list>标签

<map>标签

<constructor-arg>标签

<import>标签:导入其他的Spring的分文件

相关文章