Spring之对象依赖关系(依赖注入Dependency Injection)

简介: 承接上篇: Spring中,如何给对象的属性赋值:   1:通过构造函数,如下所示:           2:通过set方法给属性注入值,如下所示:                    2.1:通过set方法实现dao的注入,service的注入,action的注入;如下所示:        实现上面的前提是已经在对应的类中实现了下面的set方法和私有的类的成员变量的定义;        比如:在service层的方法中实现UserDao的定义和set方法的实现。

承接上篇:

Spring中,如何给对象的属性赋值:

  1:通过构造函数,如下所示:

<!-- 1:构造函数赋初始值 -->
<bean id="user1" class="com.bie.po.User">
<constructor-arg value="10010" type="int"></constructor-arg>
      <constructor-arg value="张三" type="java.lang.String"></constructor-arg>
</bean>


   2:通过set方法给属性注入值,如下所示:

<!-- 通过set方法给属性注入值,是通过set方法给属性赋值的哦,  通过容器注入值-->
<bean id="user" class="com.bie.po.User">
     <property name="id" value="10010"></property>
     <property name="name" value="李四"></property>
 </bean>   

    2.1:通过set方法实现dao的注入,service的注入,action的注入;如下所示:

       实现上面的前提是已经在对应的类中实现了下面的set方法和私有的类的成员变量的定义;

       比如:在service层的方法中实现UserDao的定义和set方法的实现。

          在action层的方法中实现UserService的定义和set方法的实现。

1 private UserDao userDao;
2     public void setUserDao(UserDao userDao) {
3         this.userDao = userDao;
4     }
1 private UserService userService;
2     public void setUserService(UserService userService) {
3         this.userService = userService;
4     }
1 private UserAction userAction;
2     public void setUserAction(UserAction userAction) {
3         this.userAction = userAction;
4     }

<!-- dao的set注入 -->
<bean id="userDao" class="com.bie.dao.UserDao"></bean>
      
<!-- service的set注入 -->
<bean id="userService" class="com.bie.service.UserService">
      <!-- 处理对象的依赖关系,依赖注入 -->
      <property name="userDao" ref="userDao"></property>
</bean>
    
<!-- action的set注入 -->
<bean id="userAction" class="com.bie.action.UserAction">
      <!-- 处理对象的依赖关系,依赖注入 -->
      <property name="userService" ref="userService"></property>
</bean>   

    2.2:通过内部bean实现dao的注入,service的注入,action的注入;如下所示:

        (缺点,相当于局部变量,service和dao只能使用一次,不方便维护)  

<!-- 内部bean -->
<bean id="userAction" class="com.bie.action.UserAction">
      <property name="userService">
          <bean class="com.bie.service.UserService">
             <property name="userDao">
                 <bean class="com.bie.dao.UserDao"></bean>
             </property>
          </bean>
      </property>

</bean>

  

  3:p命名空间,如下所示:

   《 注意:给对象属性注入值也可以通过p名称空间给对象的属性注入值,但是Spring的版本必须是3.0版本以上才可以使用

       必须在applicationContext.xml中引入这句话:xmlns:p="http://www.springframework.org/schema/p"

      》

   实现上面的前提是已经在对应的类中实现了下面的set方法和私有的类的成员变量的定义;

     比如:在service层的方法中实现UserDao的定义和set方法的实现。

          在action层的方法中实现UserService的定义和set方法的实现。

<!-- 使用p名称空间给对象的属性注入值 -->
<bean id="userDao" class="com.bie.dao.UserDao"></bean>
<bean id="userService" class="com.bie.service.UserService" p:userDao-ref="userDao"></bean>
<bean id="userAction" class="com.bie.service.UserAction" p:userService-ref="userService"></bean>


   4:自动装配(了解即可),如下所示:

    4.1:根据名称自动装配:

        实现上面的前提是已经在对应的类中实现了下面的set方法和私有的类的成员变量的定义;

        比如:在service层的方法中实现UserDao的定义和set方法的实现。

           在action层的方法中实现UserService的定义和set方法的实现。

<!-- 自动装配
        1:根据"名称"自动装配,userService注入的属性,会去IoC容器中自动查询和属性名称同名的对象
            即在service层的方法中实现UserDao的定义的名称去和IoC容器(applicationContext.xml)中名称相同的。
-->
<bean id="userDao" class="com.bie.dao.UserDao"></bean>
<bean id="userService" class="com.bie.service.UserService" autowire="byName"></bean>
<bean id="userAction" class="com.bie.service.UserAction" autowire="byName"></bean>  

    4.2:根据类型自动装配:(必须确保IoC容器[即applicationContext.xml]中只有一个该类型的对象)

        实现上面的前提是已经在对应的类中实现了下面的set方法和私有的类的成员变量的定义;

              比如:在service层的方法中实现UserDao的定义和set方法的实现。

                  在action层的方法中实现UserService的定义和set方法的实现。

<bean id="userDao" class="com.bie.dao.UserDao"></bean>
<bean id="userService" class="com.bie.service.UserService" autowire="byType"></bean>
<bean id="userAction" class="com.bie.service.UserAction" autowire="byType"></bean>


   5:注解(优点简化配置,缺点不利于维护~~~作用把对象添加到IoC容器中),如下所示:

    使用注解的开发步骤:《注解和xml配置可以一起使用的哦~~~》

      (1):先引入context名称空间

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

      (2):开启注解扫描,指定扫描哪一个包下面的类;

<!-- 开启注解扫描 -->
<context:component-scan base-package="要扫描的包的名字"></context:component-scan>

      (3):使用注解,通过注解的方式,把对象加入IoC容器中;

           还有一种简写方式,直接写@Component 和 @Resource,

            @Component加入IoC容器的UserDao对象的引用名称,默认和类名一样,且第一个字母小写。

            @Resource去容器中找UserDao类型的变量,找到后赋值 

       (4):由于dao层,service层,action层都是用@Component注解容易造成混乱,不能区分是那一层的注解;

         dao层(持久层):@Component--->@Repository

         service层(业务逻辑层):@Component--->@Service

           action层(控制层):@Component--->@Controller

 1 package com.bie.dao;
 2 
 3 import org.springframework.stereotype.Component;
 4 
 5 /** 
 6 * @author BieHongLi 
 7 * @version 创建时间:2017年3月13日 上午10:42:24 
 8 * 
 9 */
10 //注解的意思就是将userDao加入到IoC容器中
11 //这个注解就相当于<bean id="userDao" class="com.bie.dao.UserDao">
12 @Component("userDao")  
13 public class UserDao {
14 
15     public void test(){
16         
17     }
18 }
 1 package com.bie.service;
 2 
 3 import javax.annotation.Resource;
 4 
 5 import org.springframework.stereotype.Component;
 6 
 7 /** 
 8 * @author BieHongLi 
 9 * @version 创建时间:2017年3月13日 上午10:42:24 
10 * 
11 */
12 //注解的意思就是将userService加入到IoC容器中
13 //这个注解就相当于<bean id="userService" class="com.bie.service.userService">
14 @Component("userService")  
15 public class UserService {
16     
17     //这个注解会从IoC容器中找userDao对象,注入到当前字段
18     @Resource(name="userDao")
19     //这个注解相当于这个IoC容器的配置
20     //<bean id="userService" class="com.bie.service.UserService">
21     //    <property name="userDao" ref="userDao"/>
22     //</bean>
23     
24     //上面注解的userDao赋给下面的userDao的值了
25     private UserDao userDao;
26     
27     public void test(){
28         
29     }
30 }
 1 package com.bie.action;
 2 
 3 import javax.annotation.Resource;
 4 
 5 import org.springframework.stereotype.Component;
 6 
 7 /** 
 8 * @author BieHongLi 
 9 * @version 创建时间:2017年3月13日 上午10:42:24 
10 * 
11 */
12 //注解的意思就是将userAction加入到IoC容器中
13 //这个注解就相当于<bean id="userAction" class="com.bie.action.userAction">
14 @Component("userAction")  
15 public class UserAction {
16     
17     //这个注解会从IoC容器中找userService对象,注入到当前字段
18     @Resource(name="userService")
19     //这个注解相当于这个IoC容器的配置
20     //<bean id="userAction" class="com.bie.action.userAction">
21     //    <property name="userService" ref="userService"/>
22     //</bean>
23     
24     //上面注解的userService赋给下面的userService的值了
25     private UserDao userService;
26     
27     public void test(){
28         
29     }
30 }

Spring的IoC容器是个好东西啊~~~

目录
相关文章
|
3月前
|
XML Java 测试技术
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
这篇文章介绍了Spring5框架的三个新特性:支持@Nullable注解以明确方法返回、参数和属性值可以为空;引入函数式风格的GenericApplicationContext进行对象注册和管理;以及如何整合JUnit5进行单元测试,同时讨论了JUnit4与JUnit5的整合方法,并提出了关于配置文件加载的疑问。
Spring5入门到实战------17、Spring5新功能 --Nullable注解和函数式注册对象。整合JUnit5单元测试框架
|
1月前
|
Java Spring
获取spring工厂中bean对象的两种方式
获取spring工厂中bean对象的两种方式
37 1
|
1月前
|
前端开发 Java Spring
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
【Spring】“请求“ 之传递单个参数、传递多个参数和传递对象
103 2
|
1月前
|
存储 Java 程序员
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
本文详细讲解了Spring框架中IOC容器如何存储和取出Bean对象,包括五大类注解(@Controller、@Service、@Repository、@Component、@Configuration)和方法注解@Bean的用法,以及DI(依赖注入)的三种注入方式:属性注入、构造方法注入和Setter注入,并分析了它们的优缺点。
27 0
SpringIOC和DI的代码实现,Spring如何存取对象?@Controller、@Service、@Repository、@Component、@Configuration、@Bean DI详解
|
2月前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
40 4
|
3月前
|
Java Spring 容器
彻底改变你的编程人生!揭秘 Spring 框架依赖注入的神奇魔力,让你的代码瞬间焕然一新!
【8月更文挑战第31天】本文介绍 Spring 框架中的依赖注入(DI),一种降低代码耦合度的设计模式。通过 Spring 的 DI 容器,开发者可专注业务逻辑而非依赖管理。文中详细解释了 DI 的基本概念及其实现方式,如构造器注入、字段注入与 setter 方法注入,并提供示例说明如何在实际项目中应用这些技术。通过 Spring 的 @Configuration 和 @Bean 注解,可轻松定义与管理应用中的组件及其依赖关系,实现更简洁、易维护的代码结构。
51 0
|
3月前
|
设计模式 自然语言处理 Java
简单了解下Spring中的各种Aware接口实现依赖注入
在Spring框架中,Aware接口是一组用于提供特定资源或环境信息的回调接口。这些接口被设计用来允许Bean获取对Spring容器或其他相关资源的引用,并在需要时进行适当的处理。
36 2
|
3月前
|
安全 Java C#
Spring创建的单例对象,存在线程安全问题吗?
Spring框架提供了多种Bean作用域,包括单例(Singleton)、原型(Prototype)、请求(Request)、会话(Session)、全局会话(GlobalSession)等。单例是默认作用域,保证每个Spring容器中只有一个Bean实例;原型作用域则每次请求都会创建一个新的Bean实例;请求和会话作用域分别与HTTP请求和会话绑定,在Web应用中有效。 单例Bean在多线程环境中可能面临线程安全问题,Spring容器虽然确保Bean的创建过程是线程安全的,但Bean的使用安全性需开发者自行保证。保持Bean无状态是最简单的线程安全策略;
|
3月前
|
自然语言处理 Java 开发者
简单了解下Spring中的各种Aware接口实现依赖注入
【8月更文挑战第21天】在Spring框架中,Aware接口系列是一种特殊的机制,它允许Bean在初始化过程中获取到Spring容器或容器中的特定资源,从而实现了更加灵活和强大的依赖注入方式。本文将围绕Spring中的各种Aware接口,详细探讨它们如何帮助开发者在工作和学习中更好地实现依赖注入。
104 0
|
4月前
|
缓存 安全 Java
Spring高手之路21——深入剖析Spring AOP代理对象的创建
本文详细介绍了Spring AOP代理对象的创建过程,分为三个核心步骤:判断是否增强、匹配增强器和创建代理对象。通过源码分析和时序图展示,深入剖析了Spring AOP的工作原理,帮助读者全面理解Spring AOP代理对象的生成机制及其实现细节。
48 0
Spring高手之路21——深入剖析Spring AOP代理对象的创建