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

承接上篇:

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容器是个好东西啊~~~

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云霄雨霁

Java--Spring框架基础

1304
来自专栏Android原创

Android代码上减少方法数的一些奇技淫巧

3个?为什么是3个?原来是多了setContentView这个方法。因为按照java的语义,如果有覆盖父类的方法,则会直接调用覆盖的方法。从smali文件可以看...

1596
来自专栏我的博客

安卓开发之Activity传递参数

1、知识点:启动activity、注册activity、button绑定监听事件、传递参数、获取参数 2、传递参数以及绑定监听代码(注意如果绑定监听出现错误:需...

1754
来自专栏ml

Spring mvc Controller接口

Spring MVC  1. 继承该接口 Controller接口,重写对应方法,或者采用注解Controller,自定义映射文件 1 @Controller ...

2955
来自专栏开发之途

Dagger2 入门笔记

网上对 Dagger2 进行介绍的文章也已经很多了,一开始看的时候却总是有种从入门到放弃的感觉,因为 Dagger2 中注解的配套使用是需要一定规则的,而文章介...

894
来自专栏Android常用基础

Dagger2-从入门到精通(下)

继上篇文章,这篇我们来学习Dagger2的高级用法。如果没看上篇文章的话最好先看下上篇文章再来学习本章,因为本章是接续上篇文章来写的,直接来看的话可能效果不是很...

2562
来自专栏飞雪无情的博客

Android Layout的layout_height等属性为什么会不起作用?

有的时候,我们配置好的布局文件,在加载完成添加到我们的Activity中后发现,并没有安装我们设置的属性来布局,比为我们设置了android:layout_ma...

943
来自专栏Java3y

SpringMVC入门就这么简单

什么是SpringMVC? SpringMVC是Spring家族的一员,Spring是将现在开发中流行的组件进行组合而成的一个框架!它用在基于MVC的表现层开发...

3616
来自专栏大闲人柴毛毛

Android LayoutInflater原理分析,带你一步步深入了解View(一)

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/12921889 相信接触Android久一...

36512
来自专栏学海无涯

Android开发之帧动画

Android动画主要分为3种 View动画(Android开发之View动画) 帧动画 属性动画 何为帧动画? 帧动画最简单,通过顺序播放一系列的图像产生动画...

2948

扫码关注云+社区