Spring框架(2)--依赖注入

在开发中我们大多数使用的MVC的架构,Spring框架直接引用的是service层而不是dao层,使用依赖注入就可以通过service层来调用dao层。

Bean的依赖注入入门:

Bean的依赖注入概念:
  依赖注入(Dependency Injection):它是Spring框架核心IOC的具体实现。在编写程序时,通过控制反转,把对象的创建交给了Spring,但是代码中不可能出现没有依赖的情况。
  IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。 那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
  简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取

通过构造方法注入:

①创建 UserService和UserDao,UserService内部在调用UserDao的save()方法

public class UserServiceImpl implements UserService {
        @Override
        public void save() {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            UserDao userDao = (UserDao) applicationContext.getBean("userDao");
            userDao.save();
        }
    }

②将 UserServiceImpl 的创建权交给 Spring,配置Spring容器调用有参构造时进行注入

<bean id="userDao"class="com.itheima.dao.impl.UserDaoImpl"/>  <bean id="userService"class="com.itheima.service.impl.UserServiceImpl"> <constructor-arg name = "userDao" ref="userDao"></constructor-arg> </bean>

③从 Spring 容器中获得 UserService 进行操作

1 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
2 UserService userService = (UserService) applicationContext.getBean("userService");3 userService.save();

通过set方法注入:

1.在UserServiceImpl中添加setUserDao方法

public class UserServiceImpl implements UserService {        private UserDao userDao;    

    public void setUserDao(UserDao userDao) {               this.userDao = userDao;    }     

    @Override            public void save() {        userDao.save();    }}

2.配置Spring容器调用set方法进行注入

<bean id="userDao"class="com.itheima.dao.impl.UserDaoImpl"/>
    <bean id="userService"class="com.itheima.service.impl.UserServiceImpl">
    <property name="userDao"ref="userDao"/> </bean>

set方法:P命名空间注入
P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下: 首先,需要引入P命名空间:

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

其次,需要修改注入方式

<bean id="userService" class="com.itheima.service.impl.UserServiceImpl" p:userDao ref="userDao"/>

  Bean的依赖注入的数据类型:

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

注入数据的三种数据类型:

普通数据类型

引用数据类型

集合数据类型

其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注 入为例,演示普通数据类型和集合数据类型的注入。

Bean的依赖注入的数据类型

(1)普通数据类型的注入:

 1  public class UserDaoImpl implements UserDao {
 2         private String company;    
 3         private int age;    
 4
 5         public void setCompany(String company) {        this.company = company;  }    
 6
 7         public void setAge(int age) {        this.age = age;  }    
 8
 9         public void save() {        System.out.println(company + "===" + age);        
10             System.out.println("UserDao save method running....");     }
11     }
1 <bean id="userDao"class="com.itheima.dao.impl.UserDaoImpl">
2                <property name="company"value="盖伦"></property>
3                <property name="age"value="25"></property> </bean>

(2)集合数据类型(List)的注入:

 1  public class UserDaoImpl implements UserDao {
 2         private List<String> strList;
 3
 4         public void setStrList(List<String> strList) {
 5             this.strList = strList;
 6         }
 7
 8         public void save() {        System.out.println(strList);        
 9             System.out.println("UserDao save method running....");
10         }
11     }
<bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">
               <property name="strList">
                   <list>
               <value>aaa</value>
                       <value>bbb</value>
                       <value>ccc</value>
                   </list>
               </property>
    </bean>

(3)集合数据类型(List)的注入:

 1 public class UserDaoImpl implements UserDao {
 2         private List<User> userList;
 3
 4         public void setUserList(List<User> userList) {
 5             this.userList = userList;  }
 6
 7         public void save() {
 8             System.out.println(userList);
 9             System.out.println("UserDao save method running....");
10         }
11     }
 1 <bean id="u1" class="com.itheima.domain.User"/>
 2     <bean id="u2" class="com.itheima.domain.User"/>
 3     <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">   
 4         <property name="userList">       
 5             <list>           
 6                 <bean class="com.itheima.domain.User"/>     
 7                 <bean class="com.itheima.domain.User"/>           
 8                 <ref bean="u1"/>           
 9                 <ref bean="u2"/>             
10             </list>   
11         </property>
12     </bean>

(4)集合数据类型( Map<String,User> )的注入:

1  public class UserDaoImpl implements UserDao {    
2         private Map<String, User> userMap;    
3
4         public void setUserMap(Map<String, User> userMap) {    this.userMap = userMap;  }    
5
6         public void save() {      System.out.println(userMap);
7             System.out.println("UserDao save method running....");
8         }
9     }
 1 <bean id="u1" class="com.itheima.domain.User"/>
 2     <bean id="u2" class="com.itheima.domain.User"/>
 3     <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">   
 4         <property name="userMap">       
 5             <map>                       
 6                 <entry key="user1" value-ref="u1"/>           
 7                 <entry key="user2" value-ref="u2"/>       
 8             </map>   
 9         </property>
10     </bean>

(5)集合数据类型(Properties)的注入:

 1 public class UserDaoImpl implements UserDao {    
 2         private Properties properties;    
 3
 4         public void setProperties(Properties properties) {        this.properties = properties;  }
 5
 6         public void save() {
 7             System.out.println(properties);
 8             System.out.println("UserDao save method running....");
 9         }
10     }
1 <bean id="userDao" class="com.itheima.dao.impl.UserDaoImpl">   
2         <property name="properties">       
3             <props>
4                 <prop key="p1">aaa</prop>
5                 <prop key="p2">bbb</prop>
6                 <prop key="p3">ccc</prop>        
7             </props>   
8         </property>
9     </bean>

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

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

<import resource="applicationContext-xxx.xml"/>

原文地址:https://www.cnblogs.com/j9527/p/12030543.html

时间: 2024-11-06 07:27:26

Spring框架(2)--依赖注入的相关文章

采用dom4j和反射模拟Spring框架的依赖注入功能

Spring的依赖注入是指将对象的创建权交给Spring框架,将对象所依赖的属性注入进来的行为.在学习了dom4j后,其实也可以利用dom4j和反射做一个小Demo模拟Spring框架的这种功能.下面是具体的步骤: 第一步,编写配置文件.配置文件的书写,采用了和Spring的配置文件applicationContext.xml一样的书写规则: <?xml version="1.0" encoding="UTF-8"?> <!-- applicati

spring框架学习--依赖注入

spring框架为我们提供了三种注入方式,分别是set注入,构造方法注入,接口注入.接口注入不作要求,下面介绍前两种方式. 1,set注入 采用属性的set方法进行初始化,就成为set注入. 1)给普通字符类型赋值. [java] view plain copy print? public class User{ privateString username; publicString getUsername() { returnusername; } publicvoid setUsernam

JavaEE开发之Spring中的依赖注入与AOP编程

一.快速创建Mava管理的Spring工程 因为本篇博客是讨论关于Spring的东西,所以我们就不创建WebApp的工程了.我们使用Spring来快速的创建一个Maven管理的工程.如下所示找到File->New->Maven Project选项来创建一个新的Maven Project,具体如下所示: 下方我们选择创建一个简单的Maven工程,跳过模板的选择.上篇博客我们在创建Maven工程时,是没有选择下方这个选项的,然后我们选择了一个WebApp的模板.而本篇博客,我们不需要WebApp的

spring四种依赖注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种

spring 四种依赖注入方式以及注解注入方式

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化, 而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员, 而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种依赖注

spring学习笔记-依赖注入

学习过程访问的地址,按顺序理解: [email protected]注解与自动装配 spring四种依赖注入方式 Spring注解注入 <context:component-scan>使用说明 详细:Spring零配置通过注解实现Bean依赖注入总结

spring四种依赖注入方式 (set,构造器,工厂,注解 )

平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中.依赖注入的另一种说法是"控制反转",通俗的理解是:平常我们new一个实例,这个实例的控制权是我们程序员,而控制反转是指new实例工作不由我们程序员来做而是交给spring容器来做. spring有多种

[ASP.NET Core 3框架揭秘] 依赖注入:控制反转

ASP.NET Core框架建立在一些核心的基础框架之上,这些基础框架包括依赖注入.文件系统.配置选项和诊断日志等.这些框架不仅仅是支撑ASP.NET Core框架的基础,我们在进行应用开发的时候同样会频繁地使用到它们.对于这里提到的这几个基础框架,依赖注入尤为重要.ASP.NET Core应用在启动以及后续针对请求的处理过程中,它会依赖各种的组件提供服务.为了便于定制,这些组件一般会以接口的形式进行"标准化",我们将这些标准化的组件统一称为"服务(Service)"

[ASP.NET Core 3框架揭秘] 依赖注入:IoC模式

原文:[ASP.NET Core 3框架揭秘] 依赖注入:IoC模式 正如我们在<依赖注入:控制反转>提到过的,很多人将IoC理解为一种"面向对象的设计模式",实际上IoC不仅与面向对象没有必然的联系,它自身甚至算不上是一种设计模式.一般来讲,设计模式提供了一种解决某种具体问题的方案,但是IoC既没有一个针对性的问题领域,其自身也没有提供一种可操作性的解决方案,所以我们更加倾向于将IoC视为一种设计原则.很多我们熟悉的设计模式背后都采用了IoC原则,接下来我们就来介绍几种典

[ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式

原文:[ASP.NET Core 3框架揭秘] 依赖注入:依赖注入模式 IoC主要体现了这样一种设计思想:通过将一组通用流程的控制权从应用转移到框架之中以实现对流程的复用,并按照"好莱坞法则"实现应用程序的代码与框架之间的交互.我们可以采用若干设计模式以不同的方式实现IoC,比如我们在前面介绍的模板方法.工厂方法和抽象工厂,接下来我们介绍一种更有价值的IoC模式:依赖注入(DI:Dependency Injection). 一.由容器提供对象 和前面介绍的工厂方法和抽象工厂模式一样,依